Java排序逻辑和识别两个对象的最大值

标签 java sorting arraylist comparator

要求是找到部门 2 的组号 8 和部门 2 的组号 4 的最新员工对象(最新日期)。同样的方法,部门 1 中的组号 8 和部门 1 中的组号 4。我只在最终列表中需要上述所有对象中的最新一个对象。

写的比较逻辑是按照需要的顺序排序,只保留需要的对象。但是我被困住了,因为我找不到从排序列表中保留单个对象的方法。无论如何我可以实现它吗?忽略比较器逻辑,如果您可以建议使用流或其他良好实现的任何 ootb 方式,我将不胜感激?

  SimpleDateFormat df = new SimpleDateFormat("dd-mm-yyyy");
    List<Employee> employees = new LinkedList<Employee>(Arrays.asList(
        new Employee("Emp1", df.parse("12-08-2020"),
            new EmpType("1", new Group(8))),
        new Employee("Emp2", df.parse("11-08-2020"),
            new EmpType("2", new Group(8))),
        new Employee("Emp3", df.parse("10-08-2020"),
            new EmpType("2", new Group(4))),
        new Employee("Emp4", df.parse("17-08-2020"),
            new EmpType("2", new Group(8))),
        new Employee("Emp5", df.parse("19-08-2020"),
            new EmpType("1", new Group(4)))));


    /* Sorting logic to sort by group number first then by department and then by date */
    Collections.sort(employees, new Comparator<Employee>() {
      @Override
      public int compare(Employee employee, Employee t1) {
        int val = 0;
        if (employee.getEmpType().getGroup().getNumber() < t1.getEmpType().getGroup().getNumber()) {
          val = 1;
        } else if (employee.getEmpType().getGroup().getNumber() > t1.getEmpType().getGroup()
            .getNumber()) {
          val = -1;
        } else {
          val = 0;
        }

        if (val == 0) {
          val = -(employee.getEmpType().getDepartment().compareTo(t1.getEmpType().getDepartment()));
        }
        if (val == 0) {
          val = -employee.getDate().compareTo(t1.getDate());
        }
        return val;
      }
    });

最佳答案

您可以使用 Collections.max 而不是排序使用您已实现的相同 Comparator

编辑以解决评论中的讨论:
如果我对数据结构的理解正确,EmpType 封装了我们想要为其找到“最新”员工的唯一组合。假设它正确实现了 equals(Object)hashCode() 方法,您可以流式传输列表并将其收集到来自 EmpType< 的 map 给最新的员工:

Map<EmpType, Employee> latestEmployees =
    employees.stream()
             .collect(Collectors.toMap(
                          Employee::getEmpType,
                          Function.identity(),
                          BinaryOperator.maxBy(
                              Comparator.comparing(Employee::getDate))));

关于Java排序逻辑和识别两个对象的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63859540/

相关文章:

java - `public static <T> void main(String[] args)` 代表什么?

java - Gmail-API JAVA客户端发送邮件权限不足

c++ - 如何排序 vector <pair<string , pair<int , int>>>?

c++ - 根据比较函数 C++ 对成对数组进行排序

java - 数组列表的重复条目

Android-在Firebase数据库中编写节点内的Arraylist

java - RecyclerView 上拉刷新

java - 插入 "implements Xyz"的最佳位置是什么?抽象类与扩展类

python - 如何在巨大数据帧的每一行中找到前 n 个值的列索引

java - 将arraylist中的所有对象转换为java中的字节数组