Java 包含键和对象列表的排序映射

Java 包含键和对象列表的排序映射,java,Java,我有一张结构为map的地图,其中钥匙保存员工Id,员工收入保存员工详细信息,如empName、empCompany、incomeSrc。收入来源可能是多个(工资、出租房屋等) 员工公司名称将是唯一的,因为员工id在所有收入来源的情况下都是相同的。现在映射包含多个员工数据,我想根据员工名称对映射进行排序。虽然我正在尝试使用Comparator并尝试,但无法获得所需的输出 提前感谢。像TreeMap这样的排序映射将根据其键进行排序,而不是根据分配给它们的值进行排序。因此,由于您的键是员工id字符串,

我有一张结构为
map
的地图,其中钥匙保存员工Id,员工收入保存员工详细信息,如empName、empCompany、incomeSrc。收入来源可能是多个(工资、出租房屋等)

员工公司名称将是唯一的,因为员工id在所有收入来源的情况下都是相同的。现在映射包含多个员工数据,我想根据员工名称对映射进行排序。虽然我正在尝试使用Comparator并尝试,但无法获得所需的输出


提前感谢。

TreeMap
这样的排序映射将根据其键进行排序,而不是根据分配给它们的值进行排序。因此,由于您的键是员工id字符串,因此您将只按id对输出进行排序

您可能应该重新考虑您的数据结构。最好将
Employee
对象映射为键。然后,您可以同时访问员工的
姓名
及其
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;
}
public类Employee实现了可比较的{
私人长id;
私有字符串名称;
公共长getId(){
返回id;
}
公共长getName(){
返回名称;
}
公共内部比较(员工其他){
if(name!=null){
如果(其他!=null){
返回name.compareTo(other.getName());
}
返回1;
}
if(other!=null&&other.getName()!=null){
返回-1;
}
返回0;
}

您还可以实现
Comparable
,以便
TreeMap
按员工姓名对员工进行排序。

TreeMap
这样的排序映射将根据其键进行排序,而不是根据分配给它们的值进行排序。因此,由于键是员工id字符串,因此您的输出将仅按id排序

您可能应该重新考虑您的数据结构。最好将
员工
对象映射为键。这样您就可以访问这两个对象,即员工的
姓名
以及他的
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;
}
public类Employee实现了可比较的{
私人长id;
私有字符串名称;
公共长getId(){
返回id;
}
公共长getName(){
返回名称;
}
公共内部比较(员工其他){
if(name!=null){
如果(其他!=null){
返回name.compareTo(other.getName());
}
返回1;
}
if(other!=null&&other.getName()!=null){
返回-1;
}
返回0;
}

您还可以实现
Comparable
,这样
TreeMap
就可以按员工的姓名对员工进行排序。

因为您还没有展示到目前为止所做的事情,我只想提出一些建议。您可以使用
TreeMap
,其中
EmployeeName
正如您所说的那样是唯一的?TreeMap是可导航的实现地图(分类地图的特例,其中允许导航功能,如最近的比赛场地、天花板等)


此外,您的钥匙将使用“自然排序”进行排序例如,如果您的
EmployeeName
是字符串,它们将按字典顺序排列。

因为您还没有展示到目前为止所做的事情,我只想提出一些建议。您可以使用
TreeMap
,其中
EmployeeName
是您所说的唯一?TreeMap是NavigableMap的一个实现(分类地图的特殊情况,其中允许导航功能,如最近的比赛场地、ceil等)


此外,您的密钥将使用“自然排序”进行排序。例如,如果您的
EmployeeName
是字符串,则它们将按字典顺序排序。

您要求的数据结构错误。大多数map实现都有未排序的密钥

唯一的例外-TreeMap只是一个索引键。在您的示例中,索引键是员工id,而不是他们的名字。 如果您希望有一个按员工姓名排序的列表,则必须从映射中提取所有员工,将他们放入列表中,并使用比较名称的comparator


简而言之,您的映射将始终按员工id排序,因为它是此映射键。

您要求的数据结构错误。大多数映射实现都有未排序的键

唯一的例外-TreeMap只是一个索引键。在您的示例中,索引键是员工id,而不是他们的名字。 如果您希望有一个按员工姓名排序的列表,则必须从映射中提取所有员工,将他们放入列表中,并使用比较名称的comparator

简而言之,您的地图将始终按员工id排序,因为它是此地图键。

可能重复的可能重复的