如何将数组与另一个数组进行排序

时间:2017-04-07 10:27:05

标签: java sorting

Java程序将执行以下任务是什么?

给定两个名为ac的数组。我需要针对ac进行排序。

例如,如果a={2,3,4}c={-1,2,1}。 对c进行排序将产生{2,4,3}

我是使用pair<>在C ++中完成的。如何使用内置功能在Java中执行相同的操作?

3 个答案:

答案 0 :(得分:1)

这是一种直接使用数组而不是中间数据结构的可能性。它比理想情况下更复杂(几行),但IntStream不提供sorted(Comparator),因此需要将流装箱以按辅助数组排序,然后取消装箱。

int[] a = { 2, 3, 4 };
int[] c = { -1, 2, 1 };

int[] sorted = IntStream.range(0, a.length)
    .boxed()
    .sorted((n1, n2) -> Integer.compare(c[n1], c[n2]))
    .mapToInt(Integer::intValue)
    .map(i -> a[i])
    .toArray();

该算法计算c的排序排列,然后输出a的排列。

答案 1 :(得分:0)

此算法应该有效:

public static void main(String[] args) {
    List<Integer> a = Arrays.asList(2, 3, 4);
    List<Integer> c= Arrays.asList(-1, 2, 1);

    List<Integer> sa = new ArrayList<>(a);
    Collections.sort(sa);

    List<Integer> sc = new ArrayList<>(c);
    Collections.sort(sc);

    List<Integer> b = new ArrayList<>(a);
    for (int idx = 0; idx < sc.size(); idx++) {
        b.set(c.indexOf(sc.get(idx)), sa.get(idx));
    }
}

List<Integer> b将根据a中的排序顺序包含c的元素。

工作原理:

  • 我们对a
  • 的元素进行排序
  • 我们对c的元素进行排序以确定其绝对位置。
  • 我们遍历排序c的每个绝对位置,并确定元素的相对位置。
  • 我们在a中查找元素,该元素对应于与c中元素相同的绝对位置,并将其置于与c元素的相对位置相同的相对位置

答案 2 :(得分:0)

您可以在Java中执行相同的操作:

class Pair<A, C extends Comparable<C>> implements Comparable<Pair<A,C>> {
    public final A a;
    public final C c;

    Pair(A a, C c) {
        this.a = a;
        this.c = c;
    }

    @Override
    public int compareTo(Pair<A, C> o) {
        return c.compareTo(o.c);
    }
}

...

public static void main(String[] args) {
    List<Pair<Integer,Integer>> list = new ArrayList<>();
    list.add(new Pair<>(2,-1));
    list.add(new Pair<>(3,2));
    list.add(new Pair<>(4,1));
    Collections.sort(list);
    list.stream().forEach((pair) -> {
        System.out.println(pair.a + " " + pair.c);
    });
}

更新:

或者更简单:

class Pair<A, C> {
    public final A a;
    public final C c;

    Pair(A a, C c) {
        this.a = a;
        this.c = c;
    }
}

public static void main(String[] args) {
    List<Pair<Integer,Integer>> list = new ArrayList<>();
    list.add(new Pair<>(2,-1));
    list.add(new Pair<>(3,2));
    list.add(new Pair<>(4,1));
    Collections.sort(list,
            (Pair<Integer, Integer> o1, Pair<Integer, Integer> o2) -> o1.c.compareTo(o2.c));
    list.stream().forEach((pair) -> {
        System.out.println(pair.a + " " + pair.c);
    });
}