使用for循环遍历java中的列表

时间:2012-09-08 23:50:17

标签: java list for-loop

如何使用索引迭代列表数据结构。例如,考虑一个列表形式的句子,每个元素都是一个单词。我可以使用索引单步执行每个单词吗?像这样的东西 -

// 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 个答案:

答案 0 :(得分:6)

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

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

答案 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 s:

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

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

答案 2 :(得分: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)语法显式或隐式),则O(1)中的所有列表实现都将java.util java.util.concurrent 1}}和{{1}}(忽略多线程问题,例如重度争用)。

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

答案 3 :(得分:0)

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

首先将ur元素放在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 :(得分: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>上同一个电话需要时间 与index的值成比例。所以可能会有真正的表现 考虑。

  3. 上面的processWordsInSentence实现必须明确处理少于两个元素的列表的情况。保护if内的循环可以使用for语句编写,如果您更喜欢该样式,则可以将遍历与处理实际数据分开。(/ p>

    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 :(得分: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));
}