And*_* k. 8 java sorting algorithm lambda comparator
我想基于另一个数组(索引)的排序顺序迭代两个数组(A,B),在这种情况下是10,34,32,21.
String[] A: a, b, c, d
String[] B: e, f, g, h
int[] indexes: 10, 34, 32, 21
Run Code Online (Sandbox Code Playgroud)
在这里为坏榜样道歉.我更新了索引数组以清除混淆.
预期的输入和输出
输入是三个数组.我想使用索引数组的排序迭代A,B.即我想找到一种方法来使用顺序(a,d,c,b)迭代A并使用顺序(e,h,g,f)迭代B
我的方法:
我用一种我认为与另一种方法相同的解决方案解决了这个问题.但是,第二种方法不起作用.如果有人可以解释为什么它不起作用我会很感激,因为我认为这会让我更好地理解Collections.sort在java中的工作原理.
List<Integer> indexOrder = new ArrayList<>(indexes.length);
for (int i = 0; i < indexes.length; i++) {
indexOrder.add(i);
}
Collections.sort(indexOrder, Comparator.comparing((Integer s) -> indexes[s]));
Run Code Online (Sandbox Code Playgroud)
受这个线程的启发,我创建了一个ArrayList(更喜欢AList not array),其值为(1,2,3 ... indices.length),然后使用带有ref的比较器对其进行排序.索引.上述代码按预期工作.
但是,如果我将最后一行末尾的索引[s]更改为索引[indexOrder.indexOf(s)].排序会产生错误的结果.如果ArrayList的索引与其值相同,为什么indexOf(s)给出的结果与s不同.
Collections.sort(indexOrder, Comparator.comparing((Integer s) -> indexes[indexOrder.indexOf(s)]));
Run Code Online (Sandbox Code Playgroud)
看起来你indexOrder.indexOf(s)总是期望等于s(因为你List被初始化为[0, 1, 2, 3],索引s是s).
虽然在您的原始版本中也是如此indexOrder List,但在Collections.sort开始交换您的元素时,这可能不再适用List.
为了在排序时不依赖于indexOrder排序,您可以创建一个副本List:
List<Integer> copy = new ArrayList<>(indexOrder);
Collections.sort(indexOrder, Comparator.comparing((Integer s) -> indexes[copy.indexOf(s)]));
Run Code Online (Sandbox Code Playgroud)