2016-09-27 81 views
1
具有多个字段的雇员对象

考虑下面的情况:使用单个比较器接口进行排序在Java

假设有雇员具有类属性:的eID,易名,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)如何为所有字段使用单个比较器以及如何调用它?

在此先感谢

+0

你有Java 8吗? –

+0

不,我正在使用java 7 –

回答

0

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

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

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

0

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

1

1)什么是排序的员工对象最好的常用办法:使用单独的比较的每个字段或使用的所有领域

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

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

在作决定时,问自己:

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

2)如何使用单个比较了各个领域,如何使用它?

如果你想使用所有的领域,说4个领域:nameagesalarygender(用我自己的领域为例)

您只选择1场,你是用作排序标准的兴趣。其他3个领域将被用作决胜队。

假设你按name排序。当出现两个相似的名字时,可以使用第二个字段作为决胜球,如age

如果有多名雇员具有相同的姓名和年龄,请按第3条标准对其进行排序,也可以通过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; 
    } 
}