【问题标题】:for (Object object : list) [java] constructionfor (Object object : list) [java] 构造
【发布时间】:2010-05-18 14:10:21
【问题描述】:

我的问题是,从列表中选取的元素序列是否总是相同的,

这种构造行为是确定性的吗

           java "List"s - descendants of java.util.List

2) 问题,如果我使用

for(Object o: list)
构造并在循环体内增加一个变量, 它会是列表元素的索引吗?那么,它如何通过列表的元素,从 0 到 size()-1 或混乱?
                   List.get(i) 

总是会返回这个元素?

3) 问题(我想第二个问题的答案是否定的,所以:)

         for (int i=0; i < list.size(); i++) {
         }

如果我需要保存一个元素的索引,然后通过它的 id 从列表中取回它,这是最好的方法吗?

总体:

我只需要在每个对象字段的列表中保存一个位置。

        object.setPosInList(currentIndexOfTheLoop)

现在清楚了吗?

【问题讨论】:

  • 能否请您澄清您的问题。我不确定您对其中任何一个的要求是什么,因为语言是如此支离破碎。

标签: java list collections


【解决方案1】:

List 的任何后代都将提供一个 Iterator,它以确定性的正确顺序遍历列表。

for-each 循环构造被编译成使用iterator() 方法的代码,该方法对于List 在api 中的描述如下:

迭代器

公共迭代器迭代器()
以正确的顺序返回此列表中元素的迭代器。

指定者:iterator 在接口 Collection

返回:按正确顺序遍历此列表中的元素的迭代器。

【讨论】:

  • 打赌我能找到一个“列表的后代”,它以不确定的、不正确的顺序遍历元素?
  • 在标准 api 中?那会很有趣。
【解决方案2】:

1) 是的

2) 是的

3) 没有。

还要注意,在使用 get(i) 的 LinkedLists 上是 O(i),而从迭代器中获取下一个元素(这是 for-each 所做的)是 O(1)。

【讨论】:

    【解决方案3】:

    从列表中选取的元素序列是否总是相同的

    是的。引用自API Javadoc

    有序集合(也称为序列)。此界面的用户可以精确控制每个元素在列表中的插入位置。用户可以通过整数索引(列表中的位置)访问元素,并在列表中搜索元素。

    2:

    如何遍历列表的元素,从 0 到 size()-1

    是的。

    3:不,您通常不需要手动遍历列表来获取索引元素。最常用的 List 实现是ArrayList,它是随机访问,即您可以在恒定时间内直接访问它的任何元素。对于LinkedListlist.get(i) 会隐式遍历列表直到所需的元素,因为此实现不是随机访问。

    【讨论】:

    • 不,[我的问题的第三部分]我的意思是另一回事。我必须通过列表并将其索引保存在某处。当我使用显式计数器时,它更容易。我使用 ArrayList。
    【解决方案4】:

    根据List.iterator()的API doc合约:

    返回元素的迭代器 在此列表中按正确的顺序排列。

    所以是的,List 的元素的迭代应该从索引 0 到 size()-1。从理论上讲,您可能会遇到违反合同的实现,但那是实现中的错误,而不是您的代码中的错误。

    【讨论】:

      【解决方案5】:

      另外,看看 java.util.ListIterator。

      List<Object> list = new ArrayList<Object>();
      for(ListIterator<Object> it = list.listIterator(); it.hasNext(); )
      {
        Object o = it.next();
        it.nextIndex();
        it.prevIndex(); // etc
      }
      

      【讨论】:

      • nextIndex() 是当前元素的索引吗?另外,在列表的 0 元素上返回 prevIndex() 是什么? null 还是什么?
      【解决方案6】:

      for(Object o : list) 隐式使用ListIterator,以确定的顺序返回元素。 for(int i = 0; i &lt; list.size(); i++) 还以确定的顺序从 List 中选择项目,根据定义,Lists 是有序的。

      【讨论】:

        【解决方案7】:

        @MichaelBorgwardt 这样的实现会被破坏 - 它不满足 List.iterator 的合同。

        【讨论】:

          猜你喜欢
          • 2011-02-20
          • 1970-01-01
          • 2021-12-15
          • 1970-01-01
          • 2023-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多