2012-08-16 40 views
2

我有一個集合列表,我需要顛倒它的順序。 一切工作正常反向收集列表<Object>沒有分配ListIterator

List<Point> myList = new ArrayList<Point>(); 

我可以

Collections.reverse(myList); 

扭轉這種局面,但這會導致分配java.util.AbstractList中的$ FullListIterator

我有大約5000 - 10000路徑扭轉探路者,這導致GC踢英寸

我如何反向這沒有任何必要的分配?我使用泛型池時,只要我可以但我堅持這一點。

+1

是否可以接受反向視圖(不是副本)?像[this]一樣(http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Lists.html#reverse(java.util.List))。 – gontard 2012-08-16 07:20:17

+0

這不會分配任何新東西嗎? – 2012-08-16 07:42:08

+1

有新的分配。如果您的列表實現了RandomAccess,則對於經典副本而言,它是O(1)操作而不是O(n/2)。由於它是一個顛倒的列表視圖,行爲也不同:「返回列表中的更改反映在此列表中,反之亦然」。 – gontard 2012-08-16 08:00:05

回答

1

您可以簡單地循環索引i(n-i-1)的列表和交換項目的長度。不需要分配。

int n = myList.size(); 
for (int i=n/2; i-->0;) { 
    Object o = myList.get(i); 
    myList.set(i, myList.get(n-i-1)); 
    myList.set(n-i-1, o); 
} 
+0

那麼'我'中的對象就會丟失。更好地使用交換。使用臨時變量 – 2012-08-16 07:25:10

+0

...或使用'Collections.swap()'? – 2012-08-16 07:25:41

+0

並且還在for循環中執行'myList.size()' – 2012-08-16 07:27:02

2

我會說,以不必再次循環的方式構建數據結構。我的意思是說..如果你是從數據庫中讀取這一點,使用order by條款

+0

+1我同意。如果你有機會,讓數據庫處理排序或排序。據我所知,它通常知道如何更有效地處理這些東西。 – Manuzor 2012-08-16 07:29:54

+0

這是一個二維場景,實時生成點(x,y),有電源,連接器和接收器,我找到使用Dijkstra的最短路徑,它是從 - >到 – 2012-08-16 07:31:59

2

試試這個:

int size = myList.size(); 
for (int i = 0; i < size/2; i++) { 
    Point temp = myList.get(i); 
    myList.set(i, myList.get(size - i - 1)); 
    myList.set(size - i - 1, temp); 
} 

這一切是分配一個參考點,使得應該在你的情況下,精。

1

運行列表的大小一半的循環,它會像這些交換 first-with-last second-with-(last-1) third-with-(last-2) ...so on...

for(int i=0;i<list.size()/2;i++){   
    Object temp=list.get(i); 
    list.set(i, list.get(list.size()-(i+1))); 
    list.set(list.size()-(i+1), temp); 
} 
0

是一個ArrayList絕對必要的嗎?

如果倒車是您唯一的重要任務,您可以用java linked list替換它,並在時間和空間上都獲得更好的性能。