我有一个
数组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
的降序排序11
到weights
对应的索引:
{ 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 }
答案 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可能是一个很好的支持结构 - 它会将您的价值观和指数保持在成对的群组中。