使用单个Comparator接口将员工对象与java

时间:2016-09-27 19:34:10

标签: java

考虑以下情况:

假设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)如何对所有字段使用单个比较器以及如何调用它?

先谢谢

3 个答案:

答案 0 :(得分:1)

  

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

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

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

在做出决定时,问问自己:

  • 关于设计的 可重用性 。是将它们分组为1比较器比分离它们更有用吗?
  • 如果你把它们分组为1比较器,再次使用它的可能性是多少?
  • 哪一个更灵活?
  • 哪一个更容易维护?
  

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

如果您想使用所有字段,请说4个字段:nameagesalarygender (使用我自己的字段例如)

您只选择1个您有兴趣用作排序标准的字段。其他3个领域将用作打破平局。

假设您按name排序。当出现2个相似的名称时,您可以使用第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;
    }   
}

答案 1 :(得分:0)

实施取决于您。但是,您必须确定如何定义如何将员工与另一员工进行比较。例如,他们通过ID进行比较?名称?年龄?

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

由于Comparator是一个接口,你必须覆盖compare和equals方法,并定义你将在那里比较属性的逻辑。

答案 2 :(得分:0)

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