java - 按值中的多个字段对 Map 进行排序(Map 作为值)

标签 java sorting dictionary

我有一个 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/

相关文章:

python - 从 Bitmex API json 转换问题读取价格图表

python - 从 python 中的 csv 创建具有唯一属性的唯一节点字典以加载到 neo4j

java - 使用 JPA 将值添加到数据库时出现问题

java - Kryonet,无法发送 BufferedImage

c++ - 快速排序 3 个值

jquery - 修复了具有排序功能的标题 GridView

java - 如何使用 java JDBC 获取 MySql 的数据库 "Schema"名称列表

java - 如何在 Java 8 流中将参数化的 getter 调用为映射器?

java - 双属性上的比较器排序无法满足其一般契约

c++ - 将一对插入到 map 中并增加计数?