java - 根据另一个列表 Java 对列表进行排序

标签 java java-8 java-stream

我有两个列表 list1list2如下图

<表类="s-表"> <头> 列表 1 列表 2 <正文> {"EmpName":"Tony","EmpId":123} {"EmpName":"David","EmpId":123} {"EmpName":"Mark","EmpId":123} {"EmpName":"Steve","EmpId":123} {"EmpName":"Steve","EmpId":123} {"EmpName":"Mark","EmpId":123} {"EmpName":"David","EmpId":123} {"EmpName":"John","EmpId":123} {"EmpName":"吉姆","EmpId":123}

现在我想根据 list2 对 list1 进行排序。

list1 中的元素如果不在list2将在顶部,如果该元素存在于 list2 中那么它应该与 list2 的顺序相同.

所以我希望结果表是这样的。

<表类="s-表"> <头> 结果列表 <正文> {"EmpName":"Tony","EmpId":123} {"EmpName":"John","EmpId":123} {"EmpName":"吉姆","EmpId":123} {"EmpName":"David","EmpId":123} {"EmpName":"Steve","EmpId":123} {"EmpName":"Mark","EmpId":123}

我有下面的代码来执行此操作,并且可以正常工作。我真的不确定这是否会在某些情况下中断,或者是否有更好的方法来实现:

List<Employee> list = new ArrayList<>();
list.add(new Employee("Tony",123));
list.add(new Employee("Mark",123));
list.add(new Employee("Steve",123));
list.add(new Employee("David",123));
list.add(new Employee("John",123));
list.add(new Employee("Jim",123));

List<Person> list2 = new ArrayList<>();
list2.add(new Employee("David",123));
list2.add(new Employee("Steve",123));
list2.add(new Employee("Mark",123));

List<Person> newList = new ArrayList<>();
list2.forEach(e->{
        if(list.stream().filter(doc->e.getName().equalsIgnoreCase(doc.getName())).findAny().isPresent()){
                newList.add(e);
                list.removeIf(i->i.getName().equalsIgnoreCase(e.getName()));
            }
        });
        list.addAll(newList);
        System.out.println(list);

    }

最佳答案

注意:Employee 需要有一个equalshashCode,这样list::contains 才能工作.

先找出list1中所有不在list2中的元素。

list3 = list1.stream()
             .filter(Predicate.not(list2::contains))
             .collect(Collectors.toList());

那么,如果

  1. list2 中没有NOT属于list1 的元素。在这种情况下,只需将 list2 的所有元素添加到 list1 即可
list3.addAll(list2);
  1. list2 中的某些元素可能/可能不在 list1 中。将 list2 中 list1 中的元素添加到 list3。
list3.addAll(list2.stream().filter(list1::contains).collect(Collectors.toList()));

关于java - 根据另一个列表 Java 对列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68204467/

相关文章:

c# - OO 设计建议 - toString

java-8 - javaslang/Vavr : How to do a try with resource

java - 如何将 java 8 流收集/减少到 pojo 中?

java - 当我在 Debug模式下中断 JUnit4 测试时如何清理资源?

java - 哈希集检索相同元素

java - 为什么使用invokedynamic 调用Java 8 lambda?

java - 如何使用带有对象列表的 java 8 流获取一些统计信息

java - ifPresent Stream 的 Else 方法

java - Spring Boot 启动器依赖项是否已准备好生产?

java - 如何从 java 8 中的 js 函数获取数组输出?