通过double []数组对int []数组进行排序

时间:2011-12-04 21:45:40

标签: java arrays sorting

我有一个

数组
double[] weights = { 32.0, 32.0, 25.0, 25.0, 30.0, 28.0,
                     12.0, 10.0,  8.0,  8.0, 18.0,  0.0 };

我想根据0的降序排序11weights对应的索引:

{ 32.0, 32.0, 30.0, 28.0, 25.0, 25.0, 18.0, 12.0, 10.0, 8.0, 8.0, 0.0 }

在这种情况下,我想要的输出是int[]

{ 0, 1, 4, 5, 2, 3, 10, 6, 7, 8, 9, 11 }

我添加了一个int []值来跟踪索引:

int[] values = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }

3 个答案:

答案 0 :(得分:7)

制作一个类似的容器类,像这样

class EvanContainer implements Comparable<EvanContainer> {
    double weight;
    int value;

    EvanContainer(double w, int v) { weight = w; value = v; }

    public int compareTo(EvanContainer other) {
        return Double.compare(weight, other.weight);
    } 

}

然后你可以正常排序。

EvanContainer[] container = new EvanContainer[weights.length];
for(int i = 0; i < weights.length; i++) {
    container[i] = new EvanContainer(weights[i],values[i]);
}

Arrays.sort(container);

答案 1 :(得分:1)

我最近遇到了这个问题,而glowcoder的答案肯定是最干净,最简单的答案。我对这种特殊方法的问题是,它要求你“装箱”你想要比较的每个元素。现在,如果原始数组中有大量元素,则实际上并不想将每个元素包装在一个对象中,然后使用Comparable对包装对象进行排序,因为它会影响性能。

所以我设计了以下解决方案,该解决方案在Java中作为GPL下的开源代码提供:http://open.trickl.com/trickl-sort/index.html

所提出的排序算法允许指定“Permutator”。 StandardPermutator只是根据请求重新排序数组中的元素(例如,在不同索引处交换两个元素)。 PairedPermutator也在不同的数组(在这种情况下,索引数组)上执行相同的排列。

这样我就可以在原始数组上使用相同的高效排序算法,并且还可以跟踪索引重新排列,而无需在数组中装入值。无论如何,这是理论,我没有进行任何实际的性能比较......无论哪种方式,我希望所提供的库提供更灵活的排序方法。

答案 2 :(得分:0)

Map可能是一个很好的支持结构 - 它会将您的价值观和指数保持在成对的群组中。