【问题标题】:Using single Comparator interface to sort the employee object with multiple fields in java在java中使用单个Comparator接口对具有多个字段的员工对象进行排序
【发布时间】:2017-02-05 13:45:05
【问题描述】:

考虑以下场景:

假设有 Employee Class 具有属性:eID、eName、eAge、eAddress、eDeptName,并且可以根据需要在未来添加更多。

这个 Employee 对象被添加到 hashmap 作为键和字符串作为值。

考虑以下主类中的代码:

     class Test
    {
        public static void main(String[] args)
       {
          Map<Employee,String> m = new HashMap<>(); 
          //Adding object in to map
          m.put(e1,"one"); 
          m.put(e2,"two"); 
          m.put(e3,"othree");
        }
    }

现在我需要使用比较器接口根据员工对象对地图进行排序。

我的问题是:-

1) 对员工对象进行排序的最常用方法是什么:对每个字段使用单独的比较器或对所有字段使用单个比较器

2) 如何对所有字段使用单个比较器以及如何调用它?

提前致谢

【问题讨论】:

  • 你有 Java 8 吗?
  • 没有。我正在使用 java 7

标签: java


【解决方案1】:

1) 对员工对象进行排序的最常用方法是什么:对每个字段使用单独的比较器或对所有字段使用单个比较器

没有最好的方法,只有你需要的。您可以为每个字段设置单独的比较器,以便您可以按特定字段对列表进行排序。您将对列表的排序方式有更多选择。

或者,当您需要它们作为决胜局时,您可以在同一个比较器中使用多个字段。但是您必须决定哪些是主要排序标准,哪些是次要标准。

做决定时,问问自己:

  • 关于设计的可重用性。将它们分组为 1 个比较器是否比将它们分开更有用?
  • 如果您将它们归为 1 个比较器,再次使用它的可能性有多大?
  • 哪一种使用起来更灵活?
  • 哪一个更容易维护?

2) 如何对所有字段使用单个比较器以及如何调用它?

如果你想使用所有字段,比如说4个字段:nameagesalarygender(以我自己的字段为例)

您只选择 1 个您感兴趣的字段作为排序标准。其他 3 个字段将用作决胜局。

假设您按name 排序。当出现 2 个相似名称时,您可以使用第二个字段作为决胜局,例如 age

如果有多名员工的姓名和年龄相同,您可以按照第三个标准对他们进行排序,可能是 salary。如果所有 3 个字段都相似,则按第 4 个条件 gender 对它们进行排序。

//example:
class EmployeeComparator implements Comparator<Employee>{
    @Override
    public int compare(Employee e1, Employee e2){
        int cmp = e1.getName().compareTo(e2.getName());
        if(cmp == 0)
            cmp = e1.getAge() - e2.getAge();
        if(cmp == 0)
            cmp = e1.getSalary() - e2.getSalary();
        if(cmp == 0)
            cmp = e1.getGender().compareTo(e2.getGender());
        return cmp;
    }   
}

【讨论】:

    【解决方案2】:

    实施取决于您。但是,您必须确定如何定义如何将员工与其他员工进行比较。例如,它们是否按 ID 进行比较?姓名?年龄?

    您可以在 compare 方法中使用所有字段的组合,其中一些有意义或只是其中一个。

    由于 Comparator 是一个接口,您必须重写 compare 和 equals 方法并定义您将在其中比较属性的逻辑。

    【讨论】:

      【解决方案3】:

      让Employee实现Comparable接口,并在compareTo()方法中包含你想要的所有字段。然后,如果你只使用 TreeMap 而不是 HashMap,你的地图项将被自动排序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-01
        • 1970-01-01
        相关资源
        最近更新 更多