Java如何基于关联数组的降序对目标数组实现单行排序?
问题解答
给出的单行代码无法实现需求,原因很明确:Java的Arrays.sort(T[], Comparator<? super T>)方法中,Comparator接收的参数是数组中的元素值,而非元素在数组中的索引。
拿你的示例来说,原数组a = [2,5,4,3],排序时Comparator里的i和j是a数组的具体元素(比如第一次比较的是2和5),此时c[j]相当于去访问c[5]——你的c数组长度只有4,这直接会抛出数组越界异常,完全达不到按c数组降序排序a的目的。
正确的实现方式
如果你想尽量简洁地实现需求,可以通过索引数组排序的方式,既不用复杂的额外结构,也能保证关联关系正确:
// 生成索引数组 Integer[] indices = IntStream.range(0, a.length).boxed().toArray(Integer[]::new); // 按c数组的降序对索引排序 Arrays.sort(indices, (i, j) -> Integer.compare(c[j], c[i])); // 根据排序后的索引重新构建a数组 a = Arrays.stream(indices).mapToInt(idx -> a[idx]).toArray();
执行后a数组就会变成[5,2,3,4],和你预期的结果一致。
如果想用更紧凑的写法,也可以把逻辑合并(可读性稍弱):
a = IntStream.range(0, a.length) .boxed() .sorted((i, j) -> Integer.compare(c[j], c[i])) .mapToInt(idx -> a[idx]) .toArray();
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

