Java:使用indexOf方法基于另一个数组对数组进行排序

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)

Era*_*ran 6

看起来你indexOrder.indexOf(s)总是期望等于s(因为你List被初始化为[0, 1, 2, 3],索引ss).

虽然在您的原始版本中也是如此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)