如何根据Java中的比例对两个数组进行排序?

时间:2016-09-25 09:01:47

标签: java arrays sorting interface

我想根据匹配索引的比例对2个数组进行排序。因此,基于a [x] / b [x]的比率,相应地对[]和b []进行排序。这是基本结构:

double[] a = {60.0, 100.0, 120.0};
double[] b = {20.0, 50.0, 30.0};

r0 = a[0]/b[0]
r1 = a[1]/b[1]
r2 = a[2]/b[2]
...

我正在开发的Java代码不起作用。有人可以给我一些帮助吗?

Arrays.sort(ratio, new Comparator<double[]>() {
    @Override
    public double compare(double[] a, double[] b) {
        double r1 = (double)a[i]/b[i];
        double r2 = (double)a[i+1]/b[i+1];
        return r1 > r2;
    }

});

3 个答案:

答案 0 :(得分:1)

您可以像这样声明Pair

static class Pair {
    double a;
    double b;
    Pair(double a, double b) {
        this.a = a;
        this.b = b;
    }
}

并将数组放入一对数组中。然后很容易对它们进行排序:

Pair[] p = new Pair[a.length];
for (int i = 0; i < p.length; i++)
    p[i] = new Pair(a[i], b[i]);

Arrays.sort(p, (p1, p2) -> Double.compare(p1.a/p1.b, p2.a/p2.b));

当然,结果是在新数组中。如果需要,您可以循环播放并将其重新设置为ab

答案 1 :(得分:0)

试试这个。

double[] a = new double[10];
double[] b = new double[10];
// fill data to a and b.
int[] indexes = IntStream.range(0, a.length)
    .boxed()
    .sorted((i, j) -> Double.compare(a[i] / b[i], a[j] / b[j]))
    .mapToInt(i -> i)
    .toArray();
double[] sortedA = IntStream.of(indexes)
    .mapToDouble(i -> a[i])
    .toArray();
double[] sortedB = IntStream.of(indexes)
    .mapToDouble(i -> b[i])
    .toArray();

如果您不使用Java8。

double[] a = new double[10];
double[] b = new double[10];
// fill data
int length = a.length;
Integer[] indexes = new Integer[length];
for (int i = 0; i < length; ++i)
    indexes[i] = i;
Arrays.sort(indexes, new Comparator<Integer>() {
    @Override public int compare(Integer o1, Integer o2) {
        return Double.compare(a[o1] / b[o1], a[o2] / b[o2]);
    }
});
double[] sortedA = new double[length];
double[] sortedB = new double[length];
for (int i = 0; i < length; ++i) {
    sortedA[i] = a[indexes[i]];
    sortedB[i] = b[indexes[i]];
}

答案 2 :(得分:0)

让我们先看一个例子:

问题:两者中哪个较大? 8/69/7

答案:一种简单的方法是对a/bc/d形式的任意两个数字执行以下操作。查看a*db*c。如果a*d较大,则a/b大于c/d,否则c/d会更大。

根据示例:8*7=56 > 9*6=54,因此8/6大于9/7

因此,请在比较器中使用上述逻辑。