【问题标题】:Sort an array as per another array (different lengths) using Comparator results in wrong order使用 Comparator 根据另一个数组(不同长度)对数组进行排序,结果顺序错误
【发布时间】:2020-07-08 12:04:46
【问题描述】:

我需要根据另一个数组对一个数组进行排序,例如:

list1: [221, 54, 50, 138, 125, 145]

list2: [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 放在顶部,其余的放在后面?

【问题讨论】:

    标签: java arrays sorting comparator


    【解决方案1】:

    list1 元素不包含在list2 中时,indexOf 返回-1,这就是为什么这些值排在第一位。因此,对于这些值,请使用 list1.size(),然后这些值将稍后出现。

    Collections.sort(list1, Comparator.comparing(listItem -> list2.contains(listItem) ? list2.indexOf(listItem): list1.size()));
    

    【讨论】:

    • 非常感谢您的回答,我已将问题设为通用但即使对数组对象进行排序也可以。
    【解决方案2】:

    您首先获取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]
    

    【讨论】:

    • 看来我需要跟进,我将上面的示例设为通用,但在我的应用程序中我需要对一组对象进行排序,而我的旧代码:Collections.sort(roomSets, Comparator.comparing(room -&gt; list.indexOf(room.getId()))); 工作(结果相反命令)。但是在Collections.sort(roomSets, Comparator.comparing(room -&gt; list.indexOf(room.getId())).reversed()); 那里添加 reversed() 函数时,它突然根本无法解析该方法。(Id 是字符串)。如果您知道为什么在添加反向函数时对象的行为会如此,请告诉我
    • @JohnMarkson - 我正忙于一些会议,等我的会议结束后我会研究新的要求。只是想确认新要求:该解决方案适用于数字,但您想要一个适用于任何类型对象(例如字符串或某个类的对象)的解决方案 - 是否正确理解您的要求?也许您可以发布一个新问题以获得更快的响应,以便其他贡献者可以发布一些解决方案,然后我才能在会议结束后进行研究。
    • 哦,感谢您的回复,即使您很忙,但我使用这篇文章本身的其他答案让它工作,其他用户建议使用三元运算符为list2 中不存在的项目
    • 太好了!祝你成功!
    猜你喜欢
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 2018-06-03
    • 2020-07-03
    • 1970-01-01
    • 2013-12-24
    相关资源
    最近更新 更多