【问题标题】:Iterating over a List of Strings In Java?迭代Java中的字符串列表?
【发布时间】:2011-05-01 00:06:41
【问题描述】:

我正在使用OpenCSV 从 CSV 文件中读取数据,并且正在使用主页中的一些示例代码:

CSVReader reader = new CSVReader(new FileReader("stockInfo.csv"));
List myEntries = reader.readAll();

我现在正试图遍历这个列表并打印出每个条目。但我似乎无法弄清楚执行此操作的代码。

谁能向我解释我应该怎么做,因为我似乎无法解决这个问题。

【问题讨论】:

    标签: java list csv iterator


    【解决方案1】:

    假设您要将每一行的每个条目输出到它自己的行:

        List<String[]> myEntries = reader.readAll();
        for (String[] lineTokens : myEntries) {
            for (String token : lineTokens) {
                System.out.println(token);
            }
        }
    

    【讨论】:

      【解决方案2】:

      你不能这样做: 1)

      for(int i = 0; i < myEntries.size(); i++){
        myEntries.get(i); // do something else here
      }
      

      2)

      for(String s: myEntries)
         // Do work on s here
      

      【讨论】:

      【解决方案3】:

      您是否尝试过使用迭代器? 应该是这样的:

      Iterator it = myEntries.iterator();
      while(it.hasNext()){
        System.out.println(it.next());
      }
      

      【讨论】:

        【解决方案4】:

        如果可能,您应该使用带有CSVReader 的泛型。 readAll() 实际上返回 List&lt;String[]&gt; 而不是 List&lt;String&gt;。然后,您只需要:

        for (String[] row : myEntries) {
          System.out.println(Arrays.toString(row));
        }
        

        【讨论】:

          【解决方案5】:

          你可以做一些这种效果。我在迭代器上添加了同步。

          List<String[]> myEntries = reader.readAll();
          Iterator<String[]> iter = myEntries.iterator();
          synchronized (iter) {
              while (iter.hasNext()) {
                  String[] items = iter.next();
          
                  for (String item: items) { //foreach loop
                      //Work with `item`
                  }
              }
          }
          

          【讨论】:

          • 您的synchronized 没有用,因为iterator() 将返回一个新的Iterator 实例。因此,您正在同步未与任何其他线程共享的局部变量。
          【解决方案6】:

          在 Java 8 及更高版本中你也可以这样做

              List<String> s = new LinkedList<>();
              s.stream().forEach(System.out::print);
          

              List<String> s = new LinkedList<>();
              s.stream().forEach(s ->
                      System.out.print(s)
              );
          

          可以改用 paralleStream() 或 stream() 来进行并行执行。网上有很多关于哪个会执行得更快的文章,答案是:“这取决于”(主要取决于列表中的项目数)

          【讨论】:

            猜你喜欢
            • 2016-06-03
            • 1970-01-01
            • 2012-05-28
            • 2016-06-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-04-14
            • 2010-10-18
            相关资源
            最近更新 更多