【问题标题】:Reversing collection List<Object> without allocating ListIterator在不分配 ListIterator 的情况下反转集合 List<Object>
【发布时间】:2012-08-16 07:16:25
【问题描述】:

我有一个收藏列表,我需要颠倒它的顺序。

一切正常
List<Point> myList = new ArrayList<Point>();

我可以用

反转它
Collections.reverse(myList); 

但这会导致分配 java.util.AbstractList$FullListIterator

我有大约 5000 - 10000 条路径要在探路者中反转,这会导致 GC 启动。

如何在没有任何必要分配的情况下扭转这种情况?我尽可能使用通用池,但我坚持这一点。

【问题讨论】:

  • 可以接受反向视图(不是副本)吗?喜欢this
  • 这不会分配新的东西吗?
  • 有新的分配。如果您的列表实现了 RandomAccess,则它是 O(1) 操作,而不是经典副本的 O(n/2)。由于是反向列表视图,所以行为也不同:“返回列表中的更改会反映在此列表中,反之亦然”。

标签: java android memory-management garbage-collection


【解决方案1】:

我会说,以您不必再次循环的方式构建您的数据结构。我的意思是说..如果您从数据库中读取此内容,请使用order by 子句

【讨论】:

  • +1 我同意。如果有机会,让数据库处理排序或排序。据我所知,它通常知道如何更有效地处理这些事情。
  • 这是一个 2d 场景,点 (x,y) 实时生成,有电源、连接器和接收器,我正在使用 Dijkstra 找到最短路径,它从 -> 到
【解决方案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);
}

所有这些分配都是对 Point 的一个引用,因此在您的情况下应该没问题。

【讨论】:

    【解决方案3】:

    您可以简单地循环列表的长度并交换索引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);
    }
    

    【讨论】:

    • 那么 'i' 中的对象就丢失了。更好地使用交换。使用临时变量
    • ...或使用Collections.swap()?
    • 并且还在 for 循环之外执行 'myList.size()'
    • @LukasEder 为什么不呢。我让你用swap方法来回答(我不喜欢回忆那些很少使用的方法)。
    • @LukasEder 我想我做对了(四舍五入确保如果尺寸奇数则不会达到中间项目)。只需复制/粘贴。
    【解决方案4】:

    循环运行一半大小的列表,就像交换这些 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);
    }
    

    【讨论】:

      【解决方案5】:

      ArrayList 绝对必要吗?

      如果倒车是您唯一重要的任务,您可以将其替换为java linked list,并在时间和空间方面获得更好的性能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-16
        • 1970-01-01
        • 2015-11-18
        • 2013-07-28
        • 1970-01-01
        • 1970-01-01
        • 2014-09-27
        相关资源
        最近更新 更多