Java程序将执行以下任务是什么?
给定两个名为a
和c
的数组。我需要针对a
对c
进行排序。
例如,如果a={2,3,4}
和c={-1,2,1}
。
对c进行排序将产生{2,4,3}
我是使用pair<>
在C ++中完成的。如何使用内置功能在Java中执行相同的操作?
答案 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);
});
}