我有一個Java列表,我想利用每一個元素訪問一次。例如,如果我有一個數組我會做這樣的:訪問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(我們假設到不知道該列表是一個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),它不增加複雜性和一些額外的空間。 – MGoksu
如果你去了另一個方向怎麼辦?隨時創建新列表並累積元素。 – matt
@BoristheSpider你是對的,我錯過了那部分問題。 – Thomas