【问题标题】:Sorting Objects [duplicate]排序对象[重复]
【发布时间】:2012-12-08 14:14:37
【问题描述】:

可能重复:
Sorting Java objects using multiple keys

我有一个员工班。根据我要排序的员工姓名。如果两个对象(即两个员工)的员工姓名相同,那么我想根据员工年龄对其进行排序。

为了对员工姓名进行排序,我实现了 COMparable 接口并使用了以下代码:

@Override
public int compareTo(Employee o) {
    return name.compareTo(o.getName());
}

这段代码对我来说很好用。但是当两名员工的姓名相同时,我无法理解如何根据年龄进行排序?

我需要为此使用比较器吗?我不确定如何实现这一点。

请帮忙

【问题讨论】:

    标签: java jakarta-ee


    【解决方案1】:

    如果名称相同(即结果为 0),那么您可以按年龄排序。如果名称返回非零结果,则返回该结果

    例如

    @Override
    public int compareTo(Employee o) {
        int i = name.compareTo(o.getName());
        if (i == 0) { //ie the names are the same
            return age.compareTo(o.getAge();
        }
        return i;
    }
    

    【讨论】:

      【解决方案2】:

      您可以将员工存储到 ArrayList 中,然后可以使用 Collections.sort 对其进行排序

      public class CustomComparator implements Comparator<Employee> {
          @Override
          public int compare(Employee o1, Employee o2) {
              return o1.getAge().compareTo(o2.getAge());
          }
      }
      

      现在您可以使用 Collections.sort 如下:

      Collections.sort(employeeList, new CustomComparator());
      

      【讨论】:

      • -1 这不考虑员工的姓名?问题说只有名字相同时才按年龄排序
      【解决方案3】:

      你描述中的逻辑应该直接转化为你的代码:

      public int compareTo(Employee o)
      {
          firstfield = name.compareTo(o.name())
          if( firstfield == 0 )
          {
              return age.compareTo(o.age())
          }
          else
          {
              return firstfield
          }
      }
      

      您也可以通过构建新的字符串进行比较来完成这项工作:

      public int compareTo(Employee o)
      {
          me = sprintf( "%s:%d", name, age)
          them = sprintf( "%s:%d", o.name, o.age )
          return me.compareTo(them)
      }
      

      【讨论】:

      • 第二种做法很糟糕,而且不起作用。 RNJ 已经给出了第一种方法作为答案,除了他的答案编译得很好,而你的答案没有。
      猜你喜欢
      • 2011-04-12
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 2013-06-19
      • 2011-09-04
      • 2016-05-21
      • 2014-12-21
      相关资源
      最近更新 更多