Java中使用for循环遍历列表

3

如何使用索引遍历列表数据结构?例如,考虑一个由单词组成的句子列表。我能使用索引逐个遍历每个单词吗?类似这样--

// 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]);
}

当然,上述代码无法正常工作,但是否可能按照这些思路进行一些操作?正如您所看到的,我想访问连续的两个元素,并使用迭代器,这样开始变得非常混乱。
6个回答

6

您可以使用get(i)方法而不是[i]

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

5

List实例与数组不同,它们有特定的方法来获取特定索引位置的项。尝试这样做:

// 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循环,可用于数组和List

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

当然,这种方法在你的情况下不能使用,因为你在每次循环中访问多个索引的元素 - 但知道这样的方法很重要。

2
在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)(忽略多线程问题,如重度争用)。
话虽如此,有些情况下迭代器无法使用,应用程序需要使用索引。

0

尝试这个简单的代码:

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));
}

0

在这种情况下,您也可以使用迭代器:

首先将元素放入ArrayList中,然后尝试像这样使用迭代器:

ArrayList arrayList = new ArrayList();

Iterator itr = arrayList.iterator();

while(itr.hasNext())
{
  System.out.println(itr.next()); // Print out the elements from arraylist

}

0

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

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<T> 是一个具有多个实现的接口。ArrayList<T> 以常量时间执行 .get(index),但相同的调用在 LinkedList<T> 上需要与索引值成比例的时间。因此,可能真正需要考虑性能问题。

上面的 processWordsInSentence 实现必须明确处理少于两个元素的列表情况。如果您喜欢这种风格,那么可以使用 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);
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接