根据属性而不是值对 HashMap 对象进行排序

Aah*_*hil 5 java hashmap

这不是我为了理解下一步要做什么而模拟的真实代码。

我有一个具有年龄、身高体重属性的 Person 类。
现在在我的班级组中,
我创建了两个四个对象

Person programmer, student, clerk, tech;
Run Code Online (Sandbox Code Playgroud)

我有 HashMap rollCall

Map<Person, Integer> rollCall = new HashMap<Person, Integer>();
Run Code Online (Sandbox Code Playgroud)

使用 Person 和 Number of Persons 作为整数类型添加所有这些

rollCall.put(programmer, 1);
rollCall.put(clerk, 2);
rollCall.put(student, 1);
rollCall.put(tech, 3);
Run Code Online (Sandbox Code Playgroud)

我见过很多人使用 TreeMap 根据值对 HashMap 进行排序,我想对 Person 的属性而不是值进行排序。我想按年龄对所有这些人进行排序(即程序员.getAge();)。我不确定我是否会使用仅适用于集合而非地图的比较器。. 请帮忙 ... 。

mae*_*ics 6

您可以Map<Person,Integer>使用自定义比较器获得按年龄递增或递减顺序迭代的 a :

Map<Person, Integer> rollCall = new TreeMap<Person, Integer>(
  new Comparator<Person>() {
    @Override public int compare(Person p1, Person p2) {
      return p1.getAge() - p2.getAge(); // Acending.
      // or  p2.getAge() - p1.getAge(); // Descending.
    }
  }
);
Run Code Online (Sandbox Code Playgroud)

当您将 Person 添加到集合中时,它们将按年龄顺序插入。


Ern*_*ill 1

首先,TreeMap按键排序,而不是按值排序。所以这已经对你有利了。用作 a 中键的任何对象都TreeMap 必须实现Comparable,或者必须提供 aComparator作为构造函数参数。您所需要做的就是根据您的属性对您的compareTo()方法 (from Comparable) 或compare()方法 (from ) 进行比较。ComparatorgetAge()

这里描述了TreeMap采用 a 的构造函数将用于对映射中的键进行排序。ComparatorComparator