【问题标题】:Sort an array of int[] via array of double[]通过 double[] 数组对 int[] 数组进行排序
【发布时间】:2011-12-04 21:45:39
【问题描述】:

我有一个数组

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 };

我想按照weights的降序排列其对应的索引011

{ 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 }

【问题讨论】:

  • Scala 中的 Oneliner:weights.zipWithIndex.sortBy(-_._1).map(_._2)。有一个 library 为 Java 提供了类似的抽象。你可以使用它。

标签: java arrays sorting


【解决方案1】:

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

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);

【讨论】:

  • 这个解决方案,不像那些使用地图(而不是多地图)的解决方案,允许在双数组中重复值
  • 这看起来很棒,glowcoder。不幸的是我得到的打印输出:EvanContainer @ 10c832d2 EvanContainer @ 47808199 EvanContainer @ 45bc887b EvanContainer @ 5ca46701 EvanContainer @ 2d66a22b EvanContainer @ 2d20cc56 EvanContainer @ 4447393f EvanContainer @ 1fff7a1e EvanContainer @ 3daa57fb EvanContainer @ 7a763f5d EvanContainer @ 693a317a EvanContainer @ 6b86768e。知道为什么吗?
  • 我认为问题出在:container[i] = new EvanContainer(weights[i],values[i]);但我可能弄错了
  • @Evan 我给你的课程并不是 100% 完成的。您应该实现toString() 方法以获得这样的良好打印输出。像public String toString() { return "value=" + value + " weight=" + weight; } 这样的东西应该可以工作。
  • 完美运行!如何将新的排序值导出到新的 int 数组?
【解决方案2】:

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

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

所呈现的排序算法允许指定“置换器”。 StandardPermutator 只是根据请求重新排序数组中的元素(例如,交换不同索引处的两个元素)。 PairedPermutator 还对不同的数组(在本例中为索引数组)执行相同的排列。

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

【讨论】:

    【解决方案3】:

    Map 可能是一个很好的支持结构——它将您的值和索引保存在成对的组中。

    【讨论】:

      猜你喜欢
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 2020-07-03
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多