对包含键和对象列表的地图进行排序

时间:2015-02-12 08:49:51

标签: java

我有一个结构为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并尝试但无法获得所需的输出。

提前致谢。

3 个答案:

答案 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排序,因为它是此地图密钥。