2012-08-16 27 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替换它,并在时间和空间上都获得更好的性能。