java - 仅访问 Java 中通用列表的每个元素一次

标签 java list listiterator

我有一个 Java 列表,我想利用对每对元素的一次访问。例如,如果我有一个数组,我会做类似的事情:

O[] x = ...;
for(int i = 0; i<x.length; i++){
     for(int j=i+1; j<x.length;j++){
          someOperation(x[i],x[j]);
     }
}

问题是我有一个列表(我们假设不知道该列表是 ArrayList 还是 LinkedList)。 为了与前面列出的案例具有相同的复杂性,我会用伪代码编写,例如:

 ListIterator<O> it1 = list.listIterator();
 while(it1.hasNext()){
      O x = it1.next();
      it2 = it1.clone();   //it2 have the same "status" of it1, but it is a different object in memory
      while(it2.hasNext()){
           y= it.next();
           someOperation(x,y);
      }
 }

据我所知,我们没有类似 it1.clone() 的东西。做类似事情的唯一方法或多或少是:

 int i = it1.nextIndex();
 it2 = list.listIterator(i);

但是,据我所知,

 list.listIterator(i);

可能有 O(n) 的复杂性——在 LinkedList 的情况下,这在其他语言中是绝对可以避免的。另一方面,使用随机访问(如 list.get(i))实现相同的算法会更糟糕。 假设列表是 LinkedList,正确的代码编写方法是什么?

最佳答案

如果可以修改列表:

Iterator<Items> things = list.iterator();

while(things.hasNext()){
    Item item = things.next();
    things.remove();
    Iterator<Item> others = list.iterator();
    while(others.hasNext()){
        //... do stuff;
    }
}

如果顺序无关紧要,您可以构建一个新列表。

List<Item> others = new ArrayList<>(list.size());
for(Item item: list){
    for(Item other: others){
        // do stuff
    }
    others.add(item);
}

关于java - 仅访问 Java 中通用列表的每个元素一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35226400/

相关文章:

python - 列表理解合并python中的各种列表

java - 将字符串添加到 ArrayList<LinkedList<String>> Java

python - generator expression 和 itertools.chain 迭代大列表哪个更快更高效?

java - 为什么 list-iterator.next();返回到 "no current element"位置,除非迭代多次直到结束?

python - 如何从 Python 列表中排序和删除重复项?

java - 无法在 onComplete 方法中设置适配器 Facebook SDK,ANDROID

java - 为什么我创建的点没有移动?

java - 此代码中 AES key 所需的大小是多少?

带节点的 Python 链表。可迭代的

jakarta-ee - Java EE应用程序中不同版本的lib