我有一个结构为Map<String, List<EmployeeIncome>>
的地图,其中密钥包含员工ID,员工收入包含员工详细信息,例如empName,empCompany,incomeSrc。收入来源可能是多个(工资,房子)出租等等。)
public class EmployeeIncome{
private String empName;
private String empCompany;
private String incomeSrc;
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public String getEmpCompany() {
return empCompany;
}
public void setEmpCompany(String empCompany) {
this.empCompany = empCompany;
}
public String getIncomeSrc() {
return incomeSrc;
}
public void setIncomeSrc(String incomeSrc) {
this.incomeSrc = incomeSrc;
}
}
员工公司名称将是唯一的,员工ID在收入来源的所有情况下都是相同的。现在地图包含员工的多个数据,我想根据员工姓名对地图进行排序。尽管我正在尝试使用Comparator并尝试但无法获得所需的输出。
提前致谢。
答案 0 :(得分:2)
像TreeMap
这样的排序映射会根据其键而不是分配给它们的值进行排序。因此,由于您的密钥是员工ID字符串,因此您只能按ID排序输出。
您应该重新考虑您的数据结构。将Employee
对象映射为关键字会更好。然后,您可以访问员工name
以及他的id
。
public class Employee implements Comparable<Employee> {
private long id;
private String name;
public long getId() {
return id;
}
public long getName() {
return name;
}
public int compareTo(Employee other) {
if (name != null) {
if (other != null) {
return name.compareTo(other.getName());
}
return 1;
}
if (other != null && other.getName() != null) {
return -1;
}
return 0;
}
您还需要实施Comparable
,以便TreeMap
按名称对您的员工进行排序。
答案 1 :(得分:1)
因为到目前为止你还没有展示你所做的事情,所以我只想提出建议。您可以使用TreeMap<EmployeeName, OtherValue>
,其中EmployeeName
是唯一的,如您所说? TreeMap是NavigableMap的一个实现(SortedMap的特例,允许使用最近的匹配层,ceil等导航功能)。
此外,您的钥匙将使用“自然订购”订购。例如。如果您的EmployeeName
是字符串,则会按顺序排列。
答案 2 :(得分:1)
您要求的数据结构错误。大多数地图实现都有未排序的键。
唯一的例外 - TreeMap仅限于密钥。在您的示例中,密钥是员工ID,而不是他们的名称。 如果您希望按员工姓名排序,则必须从地图中提取所有员工,将其放入列表并使用比较empName的比较器。
简而言之,您的地图将始终按员工ID排序,因为它是此地图密钥。