【问题标题】:iterating through list in java using for loop使用for循环遍历java中的列表
【发布时间】:2012-09-02 08:36:13
【问题描述】:

如何使用索引遍历列表数据结构。例如,考虑一个列表形式的句子,每个元素都是一个单词。我可以使用索引逐步浏览每个单词吗?像这样的——

// sentence defined something like this - List<String>
int size = sentence.size();
for (int i=0; i<size-1; i++)
{
    System.out.println(sentence[i] + " " + sentence[i+1]);
}

当然,上面的代码不起作用,但可以在这些行上做点什么吗?如您所见,我想访问两个连续的元素并使用迭代器,它开始变得非常混乱。

【问题讨论】:

    标签: java list for-loop


    【解决方案1】:

    您可以使用get(i) 方法代替[i]

    for (int i=0; i<size-1; i++) {
        System.out.println(sentence.get(i) + " " + sentence.get(i+1));
    }
    

    【讨论】:

      【解决方案2】:

      @987654321@ 实例与数组不同。他们有特定的方法来获取特定索引的项目。试试这个:

      // sentence defined something like this - List<String>
      int size = sentence.size();
      for (int i=0; i<size-1; i++)
      {
          System.out.println(sentence.get(i) + " " + sentence.get(i + 1));
      }
      

      现在,如果您有一个数组(例如 String[] sentence = new String[]{"hello", "there"}),您所拥有的就可以正常工作。

      附带说明,Java 有一个 for-each 循环,可用于 数组和Lists:

      for (String s : sentence) {
          // do something
      }
      

      当然,这不能用于您的情况,因为您在循环的每次迭代中访问多个索引处的元素 - 但重要的是要知道存在这样的东西。

      【讨论】:

        【解决方案3】:

        在这种情况下,您也可以使用 Iterator for ex:

        首先将你的元素放在arraylist上并尝试像这样使用Iterator:

        ArrayList arrayList = new ArrayList();
        
        Iterator itr = arrayList.iterator();
        
        while(itr.hasNext())
        {
          System.out.println(itr.next()); // Print out the elements from arraylist
        
        }
        

        【讨论】:

          【解决方案4】:

          您可以在不使用索引的情况下处理列表中的连续值对。这是一种方法:

          private void processWordsInSentence(List<String> sentence) {
              Iterator<String> it = sentence.iterator();
              if (it.hasNext()) {
                  String previous = it.next();
                  while(it.hasNext()) {
                      String current = it.next();
          
                      // use previous and current values, e.g.
                      System.out.println(previous + " " + current);
          
                      previous = current;
                  }
              }
          }
          

          为什么要使用类似的东西而不是sentence.get(index)?我会提供几个原因:

          1. 在您的样本中,您的处理确实与连续 列表中的值,而不是它们的位置。所以没有“增值” 不得不明确地摆弄索引。

          2. 记住List&lt;T&gt;是一个有多个接口的 实施。 ArrayList&lt;T&gt; 在常量中执行 .get(index) 时间,但在LinkedList&lt;T&gt; 上的相同呼叫需要时间 与index 的值成正比。所以可能会有真正的表演 考虑。

          上面的processWordsInSentence 实现确实必须明确处理少于两个元素的列表的情况。保护if 内的循环可以用for 语句编写,如果您更喜欢这种风格,可以更积极地将遍历与处理实际数据分开。

          private void processWordsInSentence(List<String> sentence) {
              Iterator<String> it = sentence.iterator();
              if (it.hasNext()) {
                  for (
                      String previous = it.next(), current = null;
                      it.hasNext();
                      previous = current
                  ) {                
                      // use previous and current values, e.g.
                      System.out.println(previous + " " + current);
                  }
              }
          }
          

          【讨论】:

            【解决方案5】:

            Java 中的x[i] 表达式语法只能用于数组。没有别的了。

            正如其他答案所述,使用索引遍历 Java 列表元素的方法是使用 List.get(int)。但是,执行此操作时需要考虑一个重要的性能问题。

            问题在于get(int) 调用的成本取决于您使用的List 实现类:

            • 对于ArrayList(或Vector),对长度为N 的列表的get(int) 操作是O(1)。这意味着它不依赖于列表长度,实际上它很便宜:只比someArray[i] 贵一点。

            • 对于LinkedList,列表上的get(int) 操作必须从头开始遍历列表,直到到达您要求的位置。如果列表长度为N,则get(int)(假设列表中的随机位置)的平均成本为O(N);即它与列表长度成正比。如果长度很长,那会很贵。

            相比之下,如果您使用Iterator(通过使用for (E e : l) 语法显式地或隐式地使用),则对于java.utiljava.util.concurrent 中的所有列表实现,获取每个元素将是O(1)(忽略多线程问题,例如激烈的争用)。

            话虽如此,在某些情况下迭代器不起作用,应用程序需要使用索引。

            【讨论】:

              【解决方案6】:

              试试这个简单的代码:

              List mobileSoftwares = new ArrayList();    
              mobileSoftwares.add("Android");    
              mobileSoftwares.add("IOS");    
              mobileSoftwares.add("Blackberry");    
              int size = mobileSoftwares.size();    
              for (int i = 0; i < size - 1; i++)     
              {           
                 System.out.println(mobileSoftwares.get(i));
              }
              

              【讨论】:

                猜你喜欢
                • 2019-09-07
                • 1970-01-01
                • 1970-01-01
                • 2019-01-15
                • 2022-01-06
                • 2016-04-14
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多