【问题标题】:How does the first call to previous returns the same element as the last call to next?第一次调用 previous 如何返回与最后一次调用 next 相同的元素?
【发布时间】:2016-06-28 23:44:00
【问题描述】:

我在List界面上阅读Java Tutorial Oracle,遇到如下语句:

对 next 和 previous 的调用可以混合使用,但你必须有点 小心。第一次调用 previous 返回与 最后一次调用下一个。

我很难理解这句话:第一次调用 previous 返回与最后一次调用 next 相同的元素。谁能详细解释一下?

【问题讨论】:

    标签: java list collections next


    【解决方案1】:

    希望这个例子能消除你的疑惑

    List<Integer> colls = Arrays.asList(new Integer[]{1,2,3,4,5,6,7,8,9,10});
    
    ListIterator<Integer> iterator = colls.listIterator();
    iterator.next();
    System.out.println("Last Call to next " + iterator.next());
    System.out.println("First Call to previous  " + iterator.previous());        
    

    【讨论】:

      【解决方案2】:

      list.previous 返回列表中的前一个元素并将光标位置向后移动。注意交替调用 next 和 previous 将重复返回相同的元素。

      ListIterator<Object> iterator = (ListIterator<Object>) myList.iterator();
              while (iterator.hasNext()) {
                  Object o = iterator.next();
                  Object secondObject = iterator.previous();
                  o == secondObject; // ALways
              }
      

      【讨论】:

        【解决方案3】:

        如果你改变你的心智模式,这很简单。 nextprevious 的“光标”位于 元素之间。当您调用nextprevious 时,它会移动一个元素并返回它传递的元素。

        它从第一个元素之前开始。对next 的调用返回它所经过的元素(第一个),并且光标停在第一个和第二个元素(元素0 和1)之间。

        此时调用next 将返回第二个元素并将光标留在第二个和第三个元素之间。相反,如果您调用 previous,光标将返回第一个元素并返回它,再次停留在第一个元素之前。

        【讨论】:

        • Elliott Frisch 在下面提到指针指向元素本身,但是,您已经提到光标指向元素之间。指针和光标是一样的还是指两个不同的概念?
        • 我提供了一个心理模型,您可以使用它来预测行为。 Iterator 的定义没有说明它如何在内部工作,它如何维护指向元素的“指针”。我的描述是一种抽象,它准确地捕获了界面的行为,而无需参考“幕后”发生的事情。重要的一点是Iterator 的行为就像光标在元素之间停止一样。如果你这样想,nextprevious 的行为是有道理的。这是关于接口和实现之间区别的有用教训。
        • 好的,所以您提到的光标是用于理解该概念的心智模型的一部分。指针是Java如何在内部实现迭代器的一部分?我希望我做对了
        • 100% 正确。对于接口,您只关心行为,而不关心其实现,因为不同的集合对其迭代器有不同的实现。
        【解决方案4】:

        对 previous 的第一次调用返回与对 next 的最后一次调用相同的元素。谁能详细解释一下?

        如果你说.next() 然后.previous(),由于Iterator 的内部位置,你会得到相同的实例。否则,连续调用 .next() 将返回 same instance

        a b c
          ^
        

        .next() 给出b,但将指针移动到c

        a b c
            ^
        

        所以.previous() 然后产生b

        【讨论】:

        • 所以本教程的意思是,如果我调用 next() 然后调用 previous(),将返回相同的元素,对吗?教程的措辞有时对我来说有点太简单了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-13
        • 2020-03-28
        • 2015-10-21
        • 1970-01-01
        • 2017-02-05
        相关资源
        最近更新 更多