我有一个 Map
结构,其中包含对:String=>Map
。
有没有办法按多个值对这个映射(根)进行排序?清楚的示例:
输入:
"A" => {name: "John", age: "47"}
"B" => {name: "Sam", age: "60"}
"C" => {name: "Josh", age: "30"}
"D" => {name: "Tom", age: "15"}
"E" => {name: "Josh", age: "31"}
排序:
//group 1
"A" => {name: "John", age: "47"}
//group2
"C" => {name: "Josh", age: "30"}
"E" => {name: "Josh", age: "31"}
//group3
"B" => {name: "Sam", age: "60"}
//group4
"D" => {name: "Tom", age: "15"}
输出 map 首先按名称
排序,然后(在已排序的组内)按年龄
排序。
我能够按单个映射值条目进行排序,但我找不到一种简单的方法来按多个条目(按给定顺序)进行排序。我可以尝试在每次排序后拆分此结构,应用下一级排序并在最后加入所有内容,但我正在寻找更奇特的解决方案(如果有的话)。
有什么想法吗?
最佳答案
Java提供了TreeMap
这将允许您指定一个比较器,它将在其中对您的输入进行排序。
要以传统方式使用TreeMap
,您需要执行如下操作:
private class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
@Override
public int compareTo(Person t) {
if(!this.getName().equals(t.getName()))
return this.getName().compareTo(t.getName());
return Integer.compare(this.getAge(), t.getAge());
}
}
private class CustomComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p1.compareTo(p2);
}
}
public NewClass()
{
SortedMap<Person, String> map = new TreeMap<Person, String>(new CustomComparator());
}
所以基本上你需要交换键和值对。如果这不是您想要的,那么您可以看看this以前的SO问题以获得更多答案。
关于java - 按值中的多个字段对 Map 进行排序(Map 作为值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32220387/