是啥导致我的循环仅在第一次迭代中忽略此“\t”?

Posted

技术标签:

【中文标题】是啥导致我的循环仅在第一次迭代中忽略此“\\t”?【英文标题】:What is causing my loop to ignore this "\t" only in the first iteration?是什么导致我的循环仅在第一次迭代中忽略此“\t”? 【发布时间】:2015-12-16 08:48:36 【问题描述】:

由于某种原因,我的循环仅在我的 for 循环的第一次迭代后输出“\t”。 这是我的循环代码:

input = -1;
private String[] types = "none", "vanilla", "hazelnut", "peppermint", "mocha", "caramel";
while ( (input < 0) || (input > (types.length - 1)) ) //gets user's latte flavor input
        System.out.println("Enter the number corresponding to the latte type you would like:");
        for ( int i = 0; i < types.length; i++ )
            if ( i <= (types.length - 2) ) //prints two options per line
                System.out.println(i + ": " + types[i] + "\t" + (i + 1) + ": " + types[i + 1]);
            
            else if ( i == (types.length - 1) )
                System.out.println(i + ": " + types[i]);
            
            else //does nothing on odd indices
            
            i++;
        
        input = keyboard.nextInt();
    

这会输出以下内容:

Enter the number corresponding to the latte type you would like:
0: none     1: vanilla
2: hazelnut     3: peppermint
4: mocha        5: caramel

正如我们所见,“1: vanilla”的间距与其他行不同。但是,我的 Tea 课程代码可以正常工作:

input = -1;
private String[] types = "white", "green", "oolong", "black", "pu-erh", "camomille";
while ( (input < 0) || (input > (types.length - 1)) ) //gets user's tea flavor input
        System.out.println("Enter the number corresponding to the tea type you would like:");
        for ( int i = 0; i < types.length; i++ )
            if ( i <= (types.length - 2) ) //prints two options per line
                System.out.println(i + ": " + types[i] + "\t" + (i + 1) + ": " + types[i + 1]);
            
            else if ( i == (types.length - 1) )
                System.out.println(i + ": " + types[i]);
            
            else //does nothing on odd indices
            
            i++;
        
        input = keyboard.nextInt();
    

这会输出以下内容:

Enter the number corresponding to the tea type you would like:
0: white    1: green
2: oolong   3: black
4: pu-erh   5: camomille

是什么导致我的 Latte 循环(我的 Espresso 循环也有这个间距问题)输出与我的 Tea 循环不同?感谢您帮助我理解这种行为!

【问题讨论】:

我已经建议了printf() 解决您的问题...这可能是处理您的问题的最简单方法 【参考方案1】:

TAB 确实在那里。请注意,0: none 比您发布的其他示例短一个字符。因此,您使用 Tab 切换到较早的制表位。

【讨论】:

你可能会建议一种治疗方法,可能是String.format()FormatterPrintStream.printf() 感谢您的解释。我想知道为什么选项卡似乎没有简单地缩进一个恒定的空间。【参考方案2】:

由于还没有,我将使用printf 提供解决方案。您可以只使用格式化程序(如System.out.printf() 来格式化字符串):

System.out.printf("%d: %-12s%d:%-12s\n", i, types[i], i+1, types[i+1]);
%d 允许您输入整数类型。 %-12s 允许您输入字符串(最小长度为 12 左对齐)...这将替换您的制表符!

【讨论】:

谢谢,这行得通。我总是忘记我最喜欢的打印功能中移植的java!【参考方案3】:

none 与其他词相比是一个小词。您可以将types 数组中的单词最后用空格填充以具有相同的长度以解决此问题。

【讨论】:

【参考方案4】:

制表符很棘手,因为它们受在线位置和制表符宽度的影响。

更好地使用空格填充。使用Apache Commons的便捷方式:

StringUtils.rightPad(types[i], COLUMN_WIDTH)

(根据你最长的文字调整COLUMN_WIDTH

【讨论】:

【参考方案5】:

以下是对格式的修复

System.out.println(i + ": " + String.format("%-5s\t", types[i]) + (i + 1) + ": " + types[i + 1]);

这将解决问题。

【讨论】:

这解决了我在本地测试时的问题。为什么会有反对票?【参考方案6】:

这是由于数组中第一个字符串的长度造成的。用“nonee”代替“none”试试看。

如果你想正确地做到这一点,你应该使用某种填充。

【讨论】:

【参考方案7】:

标签存在如上所述。至于为什么事情没有对齐。可以参考这个link

【讨论】:

以上是关于是啥导致我的循环仅在第一次迭代中忽略此“\t”?的主要内容,如果未能解决你的问题,请参考以下文章

迭代是啥意思?

For Loop 仅在使用 FireStore 时进行最后一次迭代

嵌套循环导致Excel崩溃

仅在第一个消息中从表单中打印出表单标签

For循环中的三元运算符导致无限迭代

如何强制结束 for 循环的迭代(不停止 for 循环)?