【问题标题】:Sorting a List of Locations对位置列表进行排序
【发布时间】:2011-08-03 13:52:33
【问题描述】:

我想对android.location.Location 的列表进行排序。排序应基于我的位置与列表中的位置的距离。所以我认为应该在搜索过程中计算距离。所以我决定使用插入排序。

这是正确的选择吗?

非常感谢

【问题讨论】:

    标签: java android sorting


    【解决方案1】:

    如果是List 位置,我会选择Collections.sort + 自定义Comparator

    final Location myLocation = someLocation;
    
    Collections.sort(locations, new Comparator<Location>() {
        @Override
        public int compare(Location o1, Location o2) {
            Float dist1 = o1.distanceTo(myLocation);
            Float dist2 = o2.distanceTo(myLocation);
            return dist1.compareTo(dist2);
        }
    });
    

    【讨论】:

    • 你认为它会比我的解决方案更快吗?
    • 让我用一个反问来回答这个问题:你认为你是一个比 Sun/Oracle 的 Java 集合框架开发人员更好的程序员吗?
    • 我不这么认为 :) 但我认为用我的解决方案我会更少调用 .distancTo() 方法
    • 呵呵.. 对我来说闻起来像是微优化。但如果这是一个问题,您可以一次将位置 + 距离配对,然后在配对列表上执行 Collections.sort(基于距离部分)。
    • Collections.sort 使用合并排序的一个版本,他们使用“分而治之”的方法来划分列表,然后使用插入排序对划分的原子列表进行排序,然后将它们合并在一起并重复直到排序完成。这平均是 O(n*log(n)) 的时间复杂度,但由于他们使用插入排序来进行原子排序,因此更糟糕的情况是 O(n^2) 但原子列表不太可能是以相反的顺序,通常这些子列表要小得多,因此它不会对性能产生太大影响。
    【解决方案2】:

    如果列表中有很多位置,您可能需要考虑排序算法的时间复杂度。

    插入排序的最坏情况 Senario 时间复杂度为 O(n^2) [n 是列表中的项目数],这意味着如果要排序的列表是一个反向排序的列表,它必须遍历整个列表对列表中的每个对象进行排序。除非您有非常大的列表,否则这似乎不是问题。

    如果您不打算对非常大的列表进行排序,则插入排序可以很好地满足您的情况。您可以查看的其他一些排序包括选择排序、冒泡排序、快速排序或合并排序。

    【讨论】:

      猜你喜欢
      • 2010-09-13
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 2020-07-03
      • 2013-03-24
      • 2014-06-21
      • 1970-01-01
      • 2023-01-08
      相关资源
      最近更新 更多