使用 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()));