【发布时间】:2016-02-05 14:20:02
【问题描述】:
我有一个 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]);
}
}
问题是我有一个 List(我们假设不知道 List 是 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,编写代码的正确方法是什么?
【问题讨论】:
-
您可以将
LinkedList复制到一个ArrayList的开头,即O(n)。然后用它做你的配对操作。这是一个额外的 O(n),不会增加复杂性和一些额外的空间。 -
如果你往另一个方向走怎么办。创建一个新列表并随时积累元素。
-
@BoristheSpider 你说得对,我错过了问题的那一部分。
-
@matt 我也喜欢你的方法。我认为它甚至比你的回答更好:) 实际上我第一次必须复制整个列表然后删除元素,而在这种方法中,我们只是在访问期间创建列表。没有任何过载..
标签: java list listiterator