【问题标题】:How to know the value of the iteration in a for-each in Java?如何知道 Java 中 for-each 中的迭代值?
【发布时间】:2020-05-21 17:07:13
【问题描述】:

我需要在屏幕上打印一些存储在 String 数组中的数据,看起来像这样:

String[] names = {"Joe", "Jessica", "Javi", "James", "Kevin"};

我试图以这种方式执行它,使用 for-each 子句:

for (String i: names) {
   System.out.print(name);
   System.out.println(",");
}

这样的输出是:

Joe,
Jessica,
Javi,
James,
Kevin,

但我想去掉最后一个逗号。在正常的 each 子句中,我会创建一个 if 子句来控制它:

for (int i=0; i<names.length; i++) {
    System.out.print(name);

    if(i!=names.length - 1) {
         System.out.println(",");
    }
}

我可以在 for-each 子句中做同样的事情吗?如何控制迭代是否在最后一个数据部分?

【问题讨论】:

  • 您可以构建StringStringBuilder 而不是立即打印,然后用substring 之类的内容删除最后一个逗号,然后一起打印出String。如果你真的想保留增强的for 循环。
  • @Andornicus 您添加了java-8java-stream 标签,但是您如何知道Java 版本?问题是关于自 Java 5 以来就存在的增强型 for 循环。
  • @Nexevis 嗯,你是对的。我已经习惯了 java-8 的流,“foreach”让我想起了流和集合上的 foreach 方法,感谢您指出这一点。

标签: java for-loop if-statement foreach collections


【解决方案1】:

你可以用这个:

var a = String.join(",\n", List.of("a", "b", "c"))

正如@RealSkeptik 建议的那样,它可以简化为:

var a = String.join(",\n", "a", "b", "c")

在这种情况下,我发现它比将Strings 转换为流更具可读性。

然后

System.out.println(a)

结果:

a,
b,
c

【讨论】:

  • 您实际上并不需要 List.of 部分。
  • @RealSkeptic 你是对的,谢谢!我什至没有注意到可变参数
【解决方案2】:

您可以使用org.apache.commons.lang3.StringUtils.join(names,",\n");

【讨论】:

    【解决方案3】:
    String[] names = {"Joe", "Jessica", "Javi", "James", "Kevin"};
    String a = String.join(",\n",names);
    System.out.println(a);
    

    【讨论】:

    • 差不多是 Andronicus 的回答,仅仅 12 分钟后。
    • 我的错,应该在发帖前刷新页面。是的,这花了我超过 12 分钟的时间来思考和输入 :)
    【解决方案4】:

    我将解决您的问题,即在使用增强的for 循环时,您可以在哪里知道迭代的“价值”。

    如果namesList,则for-each 或增强的for 循环的等效实现不完全是for (int i=0; i&lt;names.length; i++) 循环。

    for (String i: names) 写出的等效循环如下所示:

    String[] arr = {"Joe", "Jessica", "Javi", "James", "Kevin"};
    List<String> names = Arrays.asList(arr);
    for (Iterator<String> i = names.iterator(); i.hasNext(); ) {
        String str = i.next();
        System.out.print(str);
        System.out.println(",");
    }
    

    增强的for 循环是基于CollectionsIterator 构建的,如最初创建增强型for 循环时的Java 5 文档中的here 所示。

    但是,在您的示例中,您使用的是数组。

    对于数组,早期文档指出:

    for-each 结构也适用于数组,它隐藏索引变量而不是迭代器。以下方法返回 int 数组中值的总和:

    如您所见,当使用增强的for 循环时,您无法访问索引变量,如果需要为数组访问它,则应使用标准循环来代替.

    对于您当前的示例,如果您也不想使用标准的 for 循环,则其他答案中提到了诸如 String.join 之类的解决方案,但我相信这些已经得到了很好的解释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-21
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 2014-10-03
      • 1970-01-01
      • 2015-06-19
      相关资源
      最近更新 更多