考虑以下情况:
假设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)如何对所有字段使用单个比较器以及如何调用它?
先谢谢
答案 0 :(得分:1)
1)对员工对象进行排序的最常用方法是:对每个字段使用单独的比较器或对所有字段使用单个比较器
没有最好的办法,只有你需要的东西。您可以为每个字段分别设置比较器,以便按特定字段对列表进行排序。您将对列表的排序方式有更多选择。
或者,当您需要多个字段作为平局时,可以在同一个比较器中使用多个字段。但是你必须决定哪个是主要的排序标准,这是次要标准。
在做出决定时,问问自己:
2)如何对所有字段使用单个比较器以及如何调用它?
如果您想使用所有字段,请说4个字段:name
,age
,salary
,gender
(使用我自己的字段例如)
您只选择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,您的地图项将自动排序。