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

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

4

6 回答 6

6

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

for (int i=0; i<size-1; i++) {
    System.out.println(sentence.get(i) + " " + sentence.get(i+1));
}
于 2012-09-08T23:52:09.587 回答
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 循环,可以在数组Lists 上使用:

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

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

于 2012-09-08T23:53:34.443 回答
2

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

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

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

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

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

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

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

于 2012-09-09T01:03:19.673 回答
0

在这种情况下,您也可以使用 Iterator 例如:

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

ArrayList arrayList = new ArrayList();

Iterator itr = arrayList.iterator();

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

}
于 2012-09-09T00:00:02.473 回答
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),但对 a 的相同调用LinkedList<T>需要与 的值成比例的时间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);
        }
    }
}
于 2012-09-09T00:40:12.940 回答
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));
}
于 2013-07-24T05:57:14.960 回答