java - 不使用 excel 为任何长度的字符串格式化图表的最佳方法
问题描述
我正在尝试为我的名字创建一个图表,但如果名字太短或太长,它就无法正确对齐。我想知道无论字符串的长度如何,是否有办法对齐名称。下面是我使用的对齐方法
public static final String FORMAT = "%s\t%s,%s\t%s%n";
public static void print() {
for(int i = 0; i < n; i++)
System.out.printf(FORMAT, name[i], last[i], first[i], formatName[i]);
输出:
Nirvana Narayan Narayan,Nirvana Nirvana--Narayan
Kim Do Do,Kim Kim--Do
Kiri Wood Wood,Kiri Kiri--Wood
Quinn Hume Hume,Quinn Quinn--Hume
解决方案
使用
.length
,取最大值并打印较短字符串的缺失空格。
打印缺失空格的最简单方法是使用printf
格式字符串的方法,例如%-10s
打印至少 10 个字符的格式,左对齐,根据需要填充空格。
"%-23s %s%n"
例如,由于第一列的最长文本是 23,因此可以使用格式字符串,例如。现在只需编写代码来自动构建格式字符串:
String[][] input = { { "Nirvana Narayan Narayan", "Nirvana Nirvana--Narayan" },
{ "Kim Do Do", "Kim Kim--Do" },
{ "Kiri Wood Wood", "Kiri Kiri--Wood" },
{ "Quinn Hume Hume", "Quinn Quinn--Hume" } };
// Find column widths
int[] widths = new int[input[0].length];
for (String[] row : input)
for (int i = 0; i < widths.length; i++)
widths[i] = Math.max(widths[i], row[i].length());
// Build format string
StringBuilder buf = new StringBuilder();
for (int i = 0; i < widths.length - 1; i++)
buf.append("%-").append(widths[i]).append("s ");
String fmt = buf.append("%s%n").toString();
// Print table
for (String[] row : input)
System.out.printf(fmt, (Object[]) row);
输出
Nirvana Narayan Narayan Nirvana Nirvana--Narayan
Kim Do Do Kim Kim--Do
Kiri Wood Wood Kiri Kiri--Wood
Quinn Hume Hume Quinn Quinn--Hume
如果您愿意,您甚至可以添加列分隔符。
// Build format string
StringBuilder buf = new StringBuilder("|");
for (int i = 0; i < widths.length; i++)
buf.append(" %-").append(widths[i]).append("s |");
String fmt = buf.append("%n").toString();
输出
| Nirvana Narayan Narayan | Nirvana Nirvana--Narayan |
| Kim Do Do | Kim Kim--Do |
| Kiri Wood Wood | Kiri Kiri--Wood |
| Quinn Hume Hume | Quinn Quinn--Hume |
推荐阅读
- javascript - 如何摆脱反应图标(引导程序)中的可用空间?
- python - 为什么我不能使用 Gensim 下载 API 下载数据集
- c# - 在 C# 中连接到 MS Access 数据库时出现错误
- python - 尽管网络大、样本量小且数据经过预处理,Tensorflow LSTM 仍无法学习
- swiftui - 检测用户何时停止/暂停在 TextField 中写入 - SwiftUI
- c# - Xamarin.Forms - 根据设备分辨率更改设备方向
- typescript - 如何确保只读属性不可分配给可变属性?
- linux - oomkiller 是否以过量使用率启动
- excel - 如何使用更改事件计算公式并将值插入各个单元格
- python - 我如何将 numpy.ndarray 下面的形状重塑为给定的形状?