在Java中克隆迭代器?

2022-09-02 09:43:51

在游戏中,我有一个玩家列表,让我们这样说:

LinkedList<String> players = new LinkedList<String>();

我想让每个玩家与其他每个玩家进行交互,所以我写了两个嵌套循环:

Iterator<String> i1 = players.iterator();
while (i1.hasNext()) {
    String p1 = i1.next();
    Iterator<String> i2 = players.iterator();
    // But I want to do this: Iterator<String> i2 = i1.clone();
    while (i2.hasNext()) {
        String p2 = i2.next();
        System.out.println("Interact: " + p1 + ", " + p2);
    }
}

由于我只希望每对玩家交互一次,因此我想在外循环的当前玩家之后与玩家开始内循环。所以我想克隆迭代器,但那不能编译。

那么,我该怎么办呢?


答案 1

以下操作将执行此操作:

ListIterator<String> i1 = players.listIterator(0);
while (i1.hasNext()) {
    String p1 = i1.next();
    ListIterator<String> i2 = players.listIterator(i1.nextIndex());
    while (i2.hasNext()) {
        String p2 = i2.next();
        System.out.println("Interact: " + p1 + ", " + p2);
    }
}

它依赖于ListIterator从给定位置开始并了解其当前位置的能力。


答案 2

除了 aix 答案之外,我还想指出,无论你如何创建一个从特定索引开始的迭代器,它必然是一个线性运算。如果不是,您将能够使用恒定时间对列表进行任意访问

elementN = createIterator(linkedList, N).next();

这将是矛盾的。

因此,在你的情况下,我相信最有效的解决方案实际上是做

List<String> tmp = new ArrayList<String>(players);
for (int p1 = 0; p1 < tmp.size(); p1++)
    for (int p2 = p1+1; p2 < tmp.size(); p2++)
        System.out.println("Interact: " + tmp.get(p1) + ", " + tmp.get(p2));

但是请注意,它仍然与aix的解决方案具有相同的复杂性;O(n2),但可能具有较小的常数因子。