public static void main(String args[])
{
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
scan.nextLine();
String[] label = new String[n];
int[] data = new int[n];
for(int i=0; i<n*2; i++)
{
if (i<n)
{
label[i] = scan.nextLine();
}
if (i >= n)
{
data[i-n] = scan.nextInt();
}
}
for(int i=0; i<n; i++)
{
String a = "";
for(int j=0; j<data[i]; j++)
{
a = a + "*";
if(j==(data[i]-1)) System.out.println();
}
System.out.printf("%15s %-7s", label[i], a);
}
}
输入
5
Sidney
Washington DC
London
New York
The New City of a Lot of Letters
4
8
10
3
12
我无法弄清楚如何根据输入中的字母数量进行格式调整。如果我执行此代码,许多字母的新城市会混淆格式。如何在格式化的打印中使用变量值?
这是我想要的,除了最后一行的打印方式。代码应该打印到左边的flush。
答案 0 :(得分:1)
System.out.printf("%15s %-7s", label[i], a);
因为左边的缩进 15 而许多字母的新城的长度为 32 ,因此无法正常工作。
将%15s
更改为%32s
,它可以解决您的问题
修改强>
要根据输入更改缩进,请添加以下内容:
int length = 0;
for (int i = 0; i < label.length(); i++) {
if (label[i].length() > length) {
length = label[i].length();
}
}
// do your stuff
System.out.printf("%" + length + "s %-7s", label[i], a);
答案 1 :(得分:0)
目前尚不清楚问题是什么; length / padding说明符有助于对齐输出,但您需要考虑所有可能的输入。这意味着迭代数据,找到最大长度,并构造一个格式字符串,以某种方式使用该最大长度变量(例如,maxStringLength+5
)来定义该特定列的宽度。
使用几个Java ASCII表库中的任何一个都可能更容易,例如,
答案 2 :(得分:0)
根据我在屏幕截图中看到的,您只需要动态计算左子字符串的宽度,如下所示:
private static void printLine(String strLeft, String strRight, int minLeftWidth){
int width = strLeft.length() <= minLeftWidth ? minLeftWidth : strLeft.length();
System.out.println(String.format("%"+width+"s %-7s", strLeft, strRight));
}
然后,如果你调用这样的方法:
printLine("London", "*****", 15);
printLine("Oslo", "************", 15);
printLine("Paris", "**", 15);
printLine("Some Really Freakishly Complex City Name", "**********", 15);
您应该获得所需的输出。当左侧字符串变得非常长时,我还会考虑包装城市名称以涵盖这些情况。
希望这会有所帮助。 干杯