【问题标题】:Iterating a list of Strings in Java [duplicate]在Java中迭代字符串列表[重复]
【发布时间】:2016-06-03 02:28:47
【问题描述】:

我正在遍历字符串列表。我需要以逗号分隔的格式打印每个列表,除了最后一个元素。这是我的代码。

for(Iterator itr = list.iterator(); itr.hasNext();){
    List<String> l = (List<String>) itr.next();
    for(Iterator it = l.iterator(); it.hasNext();){
       System.out.print(it.next() + " ");
    }
    System.out.println();
}

这会打印出类似

listen, silent, tinsel,

如何格式化打印逻辑以删除最后一个元素后的逗号。我可以在 for i 循环上执行此操作,根据最后一个索引检查 i 的值,但想知道如何使用 Java 中的 Iterator 来执行此操作。

【问题讨论】:

  • 为什么要使用迭代器?使用流 api 和 .collect(joining(","))
  • 好的,我从来没有使用过流 API,不知道该怎么做。会检查的。
  • 我需要以逗号分隔的格式打印除最后一个元素之外的每个列表”所以如果您的列表是[[a,b][c,d,e]],您想打印a,b[lineSeparator]c,d,e 还是@987654329 @?
  • 为了记录,即使你得到的答案比你得到的更优雅,你也可以在调用 next() 之后测试迭代器是否有下一个元素。如果它没有下一个元素,则不要打印尾随逗号。

标签: java iterator


【解决方案1】:

这是一个有助于分隔符的通用技巧。把问题转过来。与其将分隔符附加到除最后一个字符串之外的所有字符串,不如将其打印在除第一个字符串之外的所有字符串的前面。在第一次迭代中使特殊的事情发生通常更容易。这是使用这个想法的一种方法:

import java.util.Arrays;
import java.util.List;

public class Test {
  public static void main(String[] args) {
    List<String> list = Arrays.asList(new String[]{"aa", "bb", "cc"});
    String delim = "";
    for(String s : list){
      System.out.print(delim);
      delim = ", ";
      System.out.print(s);
    }
    System.out.println();
  }
}

打印

aa, bb, cc

【讨论】:

    【解决方案2】:

    据我所知,您拥有List&lt;List&lt;String&gt;&gt;。这就是 Java 8 流 api 的样子:

    List<List<String>> list = Arrays.asList("a", "b", "c", "d", "e", "f", "g", "h");
    String result = list.stream()
            .flatMap(innerList -> innerList.stream())
            .collect(joining(","));
    

    flatMap 获取所有内部列表并通过仅连接列表来创建单个字符串流。 collect(joining(",")) 从单个流中获取所有元素并创建一个 String,其中值由 "," 分隔。

    这将为您提供如下输出:

    a,b,c,d,e,g,h
    

    如果您希望每个内部列表位于单独的行中,请尝试以下操作:

    String result = list.stream()
            .map(innerList -> innerList.stream().collect(joining(",")))
            .collect(joining("\n"));
    

    这将为您提供如下输出:

    a,b,c
    d,e
    g,h
    

    【讨论】:

    • 我们不能完全确定 OP 有一个 List&lt;List&lt;String&gt;&gt; 这就是为什么我一直使用 Iterator 方法 OP。但答案仍然有效。
    • @Tunaki 好主意。但是,在这种情况下,我们可以将迭代器转换为流。我根据外部循环中的list.iterator() 做出了这个假设。
    【解决方案3】:

    使用Java 8,不用写循环,直接用String.join(delimiter, elements)即可:

    返回一个新的String,该StringCharSequence 元素的副本与指定分隔符的副本连接在一起。

    示例代码如下:

    for(Iterator<List<String>> itr = list.iterator(); itr.hasNext();){
        List<String> l = itr.next();
        String str = String.join(", ", l);
        System.out.println(str);
    }
    

    使用这样的代码,您无需担心删除最后一个分隔符。

    【讨论】:

      猜你喜欢
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 2015-08-25
      • 2020-07-23
      • 2014-04-04
      • 1970-01-01
      相关资源
      最近更新 更多