【发布时间】:2020-02-09 13:31:19
【问题描述】:
我正在尝试编写一个带有两个参数的函数,int[] arr1 和 int[] arr2。然后,它应该按照arr2 中给出的顺序对arr1 进行排序。例如,如果arr1 是[5,7,9,10,7,5] 并且arr2 是[7,9,10,5],则该函数应该返回[7,7,9,10,5,5],将arr1 排序在arr2 中的元素被索引。
我编写了如下代码,但在 Arrays.sort 中不断出现错误。我想我使用 lambda 不正确。你能指出我做错了什么吗?
public int[] relativeSortArray(int[] arr1, int[] arr2) {
Map<Integer, Integer> elemToInd = new HashMap<Integer, Integer>();
for (int i = 0; i < arr2.length; i++) {
elemToInd.put(arr2[i], i);
}
Arrays.sort(arr1, (int n1, int n2) -> elemToInd.get(n1) - elemToInd.get(n2));
return arr1;
}
【问题讨论】:
-
只是一个问题:为什么要“复制”已有的排序顺序(即,为什么不直接使用
arr2)? -
原始类型不能与泛型一起使用
-
@ernest_k 我认为每次比较时通过 arr2 查找每个元素的索引会增加时间复杂度,不是吗?
-
arr2[] 是否总是保存元素的索引?即,总是有 0..N-1 之间的数字(N 是 arr1[] 的大小)并且没有重复?如果是这样的话,创建一个新数组并根据 arr2[] 的索引进行复制很容易
-
@nimrodm arr2 没有重复项,但 arr1 可以有重复项。例如 arr1 [0,0,0,100,100], arr2 [100,0] => 输出 [100,100,0,0,0]
标签: java algorithm dictionary java-8 java-stream