使用 Comparator 根据另一个数组(不同长度)对数组进行排序导致顺序错误
Sort an array as per another array (different lengths) using Comparator results in wrong order
我需要根据另一个数组对一个数组进行排序,例如:
列表 1:[221、54、50、138、125、145]
列表 2: [50, 125]
那么排序后的list1应该是:[50, 125 ,221, 54, 138, 145]
我尝试了以下代码:
Collections.sort(list1, Comparator.comparing(listItem -> list2.indexOf(listItem)));
但这会导致:[221, 54, 138, 145, 50, 125]
我怎样才能得到顶部的 50 和 125 以及后面的其余部分?
您首先获取 list1
项的原因是 list2
中不存在的元素的索引返回为 -1
,因此它们正在获取放在第一位。您需要做的就是反转顺序,如下所示:
list2.sort(Comparator.reverseOrder());
Collections.sort(list1, Comparator.comparing(listItem -> list2.indexOf(listItem)).reversed());
请注意,在应用 reversed
之前,您需要以相反的顺序对 list2
进行排序。如果您不想更改顺序或 list2
,您可以克隆 list2
并将其与 Comparator
.
一起使用
演示:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>(List.of(221, 54, 50, 138, 125, 145));
List<Integer> list2 = new ArrayList<>(List.of(50, 125));
// Clone list2
List<Integer> list2Clone = new ArrayList<>(list2);
// Sort the cloned list in reverse order
list2Clone.sort(Comparator.reverseOrder());
// Sort list1
Collections.sort(list1, Comparator.comparing(listItem -> list2Clone.indexOf(listItem)).reversed());
// Display the result
System.out.println(list1);
}
}
输出:
[50, 125, 221, 54, 138, 145]
当 list1
元素不包含在 list2
中时,则 indexOf
return -1
这就是这些值排在第一位的原因。因此,对于那些值,请使用 list1.size()
,然后这些值会稍后出现。
Collections.sort(list1, Comparator.comparing(listItem -> list2.contains(listItem) ? list2.indexOf(listItem): list1.size()));
我需要根据另一个数组对一个数组进行排序,例如:
列表 1:[221、54、50、138、125、145]
列表 2: [50, 125]
那么排序后的list1应该是:[50, 125 ,221, 54, 138, 145]
我尝试了以下代码:
Collections.sort(list1, Comparator.comparing(listItem -> list2.indexOf(listItem)));
但这会导致:[221, 54, 138, 145, 50, 125]
我怎样才能得到顶部的 50 和 125 以及后面的其余部分?
您首先获取 list1
项的原因是 list2
中不存在的元素的索引返回为 -1
,因此它们正在获取放在第一位。您需要做的就是反转顺序,如下所示:
list2.sort(Comparator.reverseOrder());
Collections.sort(list1, Comparator.comparing(listItem -> list2.indexOf(listItem)).reversed());
请注意,在应用 reversed
之前,您需要以相反的顺序对 list2
进行排序。如果您不想更改顺序或 list2
,您可以克隆 list2
并将其与 Comparator
.
演示:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>(List.of(221, 54, 50, 138, 125, 145));
List<Integer> list2 = new ArrayList<>(List.of(50, 125));
// Clone list2
List<Integer> list2Clone = new ArrayList<>(list2);
// Sort the cloned list in reverse order
list2Clone.sort(Comparator.reverseOrder());
// Sort list1
Collections.sort(list1, Comparator.comparing(listItem -> list2Clone.indexOf(listItem)).reversed());
// Display the result
System.out.println(list1);
}
}
输出:
[50, 125, 221, 54, 138, 145]
当 list1
元素不包含在 list2
中时,则 indexOf
return -1
这就是这些值排在第一位的原因。因此,对于那些值,请使用 list1.size()
,然后这些值会稍后出现。
Collections.sort(list1, Comparator.comparing(listItem -> list2.contains(listItem) ? list2.indexOf(listItem): list1.size()));