通过将Comparator与用户定义的对象

时间:2016-12-22 01:05:33

标签: java hashmap comparator treemap

我有一个HashMap如下:

public class MyHashMapOfEmployees {

  public static void main(String a[]){
    Map<String,Employee> allEmployees= new HashMap<String,Employee>();
    allEmployees.put(new Employee("111",("Ram", "Smith", "developer"));
    allEmployees.put(new Employee("222",("John", "Doe", "manager"));
    allEmployees.put(new Employee("333",("Lisa", "Hart", "CEO"));
    allEmployees.put(new Employee("444",("Mark", "Wayman", "VP"));
  }
}

这是我的员工类:

class Employee{    

private String firstName;
private String lastName;
private String position;
private String id;

public Employee(String fn, String ln, String p){
    this.firstName = fn;
    this.lastName = ln;
    this.position = p;
}     
public String getFirstName() {
    return firstName;
}
public String getLastName() {
    return lastName;
}
public String getPosition() {
    return position;
}
public String getId() {
    return id;
}

}

我需要按员工名字对HashMap进行排序,并且可以省略键(id)。最终输出应如下:

John Doe manager
Lisa Hart CEO
Mark Wayman VP
Ram Smith developer

我尝试使用以下比较器:

private final Comparator<Employee> employeeComparator = new Comparator<Employee>() {
    @Override
    public int compare(Employee o1, Employee o2) {
        return o1.getFirstName().compareTo(o2.getFirstName());
    }
};

如何根据值(在我的情况下是一个对象 - Employee)对这个HashMap进行排序,而不是通过我的对象中的特定字段(firstName)对其进行排序?

TreeMap不是正确的解决方案吗?

我已经搜索了stackOverflow,这个特定的场景没有任何内容可供我申请并开始工作。这不是一个重复,评论中提供的链接是一个不同的任务。

如果不在中间创建TreeMap,我可以执行以下操作吗?

SortedSet<Map.Entry<String, Employee>> employeesSortedByFirstName = new TreeSet<Map.Entry<String, Employee>>(employeeComparator()); 

employeesSortedByFirstName.addAll(allEmployees.entrySet());

这会按名字排序我的地图值吗?...还是按插入顺序排序?..

或者 - 我之间需要一个TreeMap:

SortedSet<Map.Entry<String, Employee>> employeesSortedByFirstName = new TreeSet<Map.Entry<String, Employee>>(employeeComparator());

SortedMap<String, Employee> sortedMap = new TreeMap<String, Employee>();
sortedMap.putAll(allEmployees); //hashmap into treemap
employeesSortedByFirstName.addAll(sortedMap.entrySet()); //add treemap into the sorted set

目标是按名字排序,而不是按地图的全部价值排序。

0 个答案:

没有答案