有一个班级
class Employee {
int id;
String name;
}
和一个包含此对象的地图
Map<Integer, Employee> map = new HashMap<Integer, Employee>();
现在我想在map
的基础上排序Employee's name
以上。表示当我使用Map.Entry
迭代此地图时,Employee
对象必须按字母顺序翻译。
提前致谢
答案 0 :(得分:3)
使用此构造函数将TreeMap与自定义Comparator一起使用:
http://docs.oracle.com/javase/6/docs/api/java/util/TreeMap.html#TreeMap(java.util.Comparator)
答案 1 :(得分:3)
您无法对HashMap
进行排序,但您可以使用entrySet()
对其条目进行排序。
public class MapSort {
private static class Employee {
public String name;
public Employee(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
public static void main(String[] args) {
Map<Integer, Employee> map = new HashMap<Integer, Employee>();
map.put(1, new MapSort.Employee("x"));
map.put(2, new MapSort.Employee("a"));
map.put(3, new MapSort.Employee("f"));
List<Map.Entry<Integer, Employee>> entryList = new ArrayList<Map.Entry<Integer, Employee>>(map.entrySet());
Collections.sort(
entryList, new Comparator<Map.Entry<Integer, Employee>>() {
@Override
public int compare(Map.Entry<Integer, Employee> integerEmployeeEntry,
Map.Entry<Integer, Employee> integerEmployeeEntry2) {
return integerEmployeeEntry.getValue().name
.compareTo(integerEmployeeEntry2.getValue().name);
}
}
);
System.out.println(entryList);
}
}
排序后,您可以将您的条目放回支持排序的地图中,例如LinkedHashMap。
这取决于您的使用案例:如果您需要始终对地图进行排序,则使用带有额外开销的TreeMap
会更简单。如果您只需要进行一次排序,则可以使用HashMap
和上述代码。
答案 2 :(得分:1)
Michaël提出了一个Sort a Map<Key, Value> by values (Java)的链接。我做了一些改变。它适用于我
class ValueComparator implements Comparator<Integer> {
Map<Integer, Employee> base;
public ValueComparator(Map<Integer, Employee> base) {
this.base = base;
}
// Note: this comparator imposes orderings that are inconsistent with equals.
public int compare(Integer a, Integer b) {
return ((Employee)base.get(a)).compareTo(base.get(b));
}
}
class Employee implements Comparable {
public String name;
public int id;
Employee(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public int compareTo(Object obj) {
return this.name.compareTo(((Employee)obj).name);
}
public String toString() {
return name;
}
}
对于解决方案,请参考上面的维度链接。
感谢所有有回复的人。