【问题标题】:Efficient way of sorting a list of tuples in java在java中对元组列表进行排序的有效方法
【发布时间】:2017-06-18 08:29:16
【问题描述】:

Given 是一个通用数据类型,看起来像这样:HashMap<EdgeTuple, Double> edgeList 其中 tuple 是一个 EdgeTuple 类,Double 是一个对任务不重要的权重:

class EdgeTuple{
    int label1;
    int label2;
    public EdgeTuple(int label1, int label2){
        int min = Math.min(label1, label2);
        int max = Math.max(label1, label2);
        this.label1 = min;
        this.label2 = max;
    }
}

如您所见,元组在第一个位置上已经具有较小的值。我想要做的是对最终进入顺序应如下所示的列表进行排序:

条目 0:[(0,something);some_weight]

条目 1:[(1,something);some_weight]

...

条目 n-1:[(last_value,something);some_weight]

所以基本上我需要做的是对元组的第一个值进行升序排序。 我在这个主题上最喜欢的现有答案是红色的,但仍然找不到任何令人满意的东西。

一种可能的解决方案是依靠比较器,如下所示:

Comparator<Tuple> myComparator = new Comparator<Tuple>() {
    public int compare(Tuple t1, Tuple t2) {
        //the comparison rules go here
    }
};
Collections.sort(tupleList, myComparator);

每对元组的比较似乎并不高效。所以我的问题是,你知道其他排序方法吗?也许一些新的数据类型可以为给定的任务提供更合适的性能接口?

谢谢

【问题讨论】:

  • 那么比较器到底有什么问题?
  • ArrayList&lt;EdgeTuple, Double&gt; edgeList 在 java 中可能吗?
  • ArrayList 只有一个模板参数。你显示两个。
  • 比较器由 Collections.sort() 使用的任何排序算法使用。如果该算法为 o(nlogn),那么比较器将被使用多次
  • Collections.sort "这个实现是一个稳定的、自适应的、迭代的mergesort ...这个实现将指定的列表转储到一个数组中,对数组进行排序,然后遍历列表,从对应的重置每个元素在数组中的位置。”如果你想知道为什么要合并排序stackoverflow.com/questions/32334319/…

标签: java performance list sorting tuples


【解决方案1】:

您可以在您的EdgeTuple 中实现Comparable 接口:

public static class EdgeTuple  implements Comparable<EdgeTuple> {
    int label1;
    int label2;
    public EdgeTuple(int label1, int label2){
        int min = Math.min(label1, label2);
        int max = Math.max(label1, label2);
        this.label1 = min;
        this.label2 = max;
    }


    @Override
    public int compareTo(EdgeTuple o) {
        return this.label1 - o.label1;
    }
}

并使用TreeMap 存储预排序的元组映射,不要每次都排序。

【讨论】:

  • 为什么要“扩展元组”?
  • @JürgenK。有问题的 Comparator 有令人困惑的部分,所以我假设 EdgeTuple 扩展了 Tuple
  • @JürgenK。我已经删除了这个扩展部分
【解决方案2】:

您的排序是在预定义范围内的整数上进行的,符合counting sort,这比任何通用排序算法都快。

您可以在Java 中使用此实现,并将其调整为您的Tuples: http://www.javacodex.com/Sorting/Counting-Sort

这是一个很好的解释 + 示例代码: http://www.geeksforgeeks.org/counting-sort/

【讨论】:

    猜你喜欢
    • 2017-01-29
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    相关资源
    最近更新 更多