【TreeMap】-根据 key 或 value 排序

1. 根据 key 排序

引言

  • TreeMap 中key 可以自动String 类型或8大基本类型的包装类型进行排序
  • 但是,TreeMap 无法直接自定义类型进行排序。
  • 当我们想对对 TreeMapkey 中的自定义类型排序时,必须要指定**排序规则。主要有两种解决方案**:

根据 key 排序,主要有两种方法

  1. 方法1:实现 Comparator 接口,并传递给 TreeMap 构造器;
  2. 方法2:使得 key 对应类 implements Comparable接口

两种排序规则如何选择呢?

  • 当比较规则不会发生改变的时候,或者说比较规则只有一个的时候,建议实现 Comparable 接口;
  • 比较规有多个,并且需要在多个比较规则之间频繁切换时,建议使用 Comparator 比较器。

方法1:实现 Comparator 接口

import java.util.*;

class Solution {
    public static void main(String[] args) {
        Map<Person, String> map = new TreeMap<>((person1, person2) -> {
            // 先按照age降序排序
            if (person1.getAge() - person2.getAge() != 0) {
                return person2.getAge() - person1.getAge();
            }
            // age相同时,按照name升序排序
            return person1.getName().compareTo(person2.getName());
        });
        map.put(new Person("zhangsan", 15), "001");
        map.put(new Person("lisi", 18), "002");
        map.put(new Person("wangwu", 20), "003");
        map.put(new Person("zhaoliu", 18), "004");
        map.put(new Person("ouyangfeng", 60), "006");
        map.put(new Person("hongqigong", 60), "005");

        System.out.println("排序后,map = ");
        for (Map.Entry<Person, String> entry : map.entrySet()) {
            System.out.println(entry);
        }
    }
}

class Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name = " + name +
                ", age = " + age +
                '}';
    }
}

运行结果如下:
在这里插入图片描述

方法2:implements Comparable

import java.util.*;

class Solution {
    public static void main(String[] args) {
        Map<Person, String> map = new TreeMap<>();
        map.put(new Person("zhangsan", 15), "001");
        map.put(new Person("lisi", 18), "002");
        map.put(new Person("wangwu", 20), "003");
        map.put(new Person("zhaoliu", 18), "004");
        map.put(new Person("ouyangfeng", 60), "006");
        map.put(new Person("hongqigong", 60), "005");

        System.out.println("排序后,map = ");
        for (Map.Entry<Person, String> entry : map.entrySet()) {
            System.out.println(entry);
        }
    }
}

// 
class Person implements Comparable<Person> {
    private String name;
    private int age;

    @Override
    public int compareTo(Person person) {
        // 先按照age降序排序
        if (this.getAge() - person.getAge() != 0) {
            return person.getAge() - this.getAge();
        }
        // age相同时,按照name升序排序
        return this.getName().compareTo(person.getName());
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name = " + name +
                ", age = " + age +
                '}';
    }
}

2. 根据 value 排序

同上根据 key 排序,根据 value 排序时,也可以有两种方法,这里仅仅展示“实现Comparator接口”的方法

map 根据 value 排序时,和根据 key 排序相比 较为繁琐,具体步骤如下:

  1. map.entrySet() 转存至 list,即 lsit 中每个元素的类型为 Map.Entry
  2. 利用 Collections.sort 根据 listertry.getValue() 进行排序;
  3. “实现Comparator接口”,自定义 ertry.getValue() 的排序规则
import java.util.*;

class Solution {
    public static void main(String[] args) {
        Map<String, Person> map = new HashMap<>();
        map.put("001", new Person("zhangsan", 15));
        map.put("002", new Person("lisi", 18));
        map.put("003", new Person("wangwu", 20));
        map.put("004", new Person("zhaoliu", 18));
        map.put("006", new Person("ouyangfeng", 60));
        map.put("005", new Person("hongqigong", 60));
        System.out.println("排序前,map = " );
        for (Map.Entry<String, Person> entry : map.entrySet()) {
            System.out.println(entry);
        }

        // 1、map to list
        List<Map.Entry<String, Person>> entries = new ArrayList<>(map.entrySet());
        // 2、重写排序规则
        Collections.sort(entries, (entry1, entry2) -> {
            Person person1 = entry1.getValue();
            Person person2 = entry2.getValue();
            // 先按照age降序排序
            if (person1.getAge() - person2.getAge() != 0) {
                return person2.getAge() - person1.getAge();
            }
            // age相同时,按照name升序排序
            return person1.getName().compareTo(person2.getName());
        });

        System.out.println("\n排序后,entries = ");
        for (Map.Entry<String, Person> entry : entries) {
            System.out.println(entry);
        }
    }
}

class Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name = " + name +
                ", age = " + age +
                '}';
    }
}

运行结果如下:
在这里插入图片描述

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java TreeMap可以按照value排序,可以通过实现Comparator接口来实现。具体步骤如下: 1. 创建一个实现Comparator接口的类,重写compare方法,比较两个value的大小。 2. 创建一个TreeMap对象,并将实现了Comparator接口的类作为参数传入。 3. 将需要排序的键值对添加到TreeMap中。 4. 使用entrySet()方法获取TreeMap中的所有键值对,并将其转换为List。 5. 使用Collections.sort()方法对List进行排序。 6. 遍历排序后的List,输出键值对。 示例代码如下: ``` import java.util.*; public class TreeMapSortByValue { public static void main(String[] args) { // 创建一个实现Comparator接口的类 ValueComparator vc = new ValueComparator(); // 创建一个TreeMap对象,并将实现了Comparator接口的类作为参数传入 TreeMap<String, Integer> map = new TreeMap<>(vc); // 将需要排序的键值对添加到TreeMap中 map.put("apple", 10); map.put("banana", 5); map.put("orange", 8); // 使用entrySet()方法获取TreeMap中的所有键值对,并将其转换为List List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet()); // 使用Collections.sort()方法对List进行排序 Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return o1.getValue().compareTo(o2.getValue()); } }); // 遍历排序后的List,输出键值对 for (Map.Entry<String, Integer> entry : list) { System.out.println(entry.getKey() + " : " + entry.getValue()); } } } // 实现Comparator接口的类 class ValueComparator implements Comparator<String> { Map<String, Integer> map = new HashMap<>(); public ValueComparator() {} public ValueComparator(Map<String, Integer> map) { this.map.putAll(map); } @Override public int compare(String s1, String s2) { if (map.get(s1) >= map.get(s2)) { return 1; } else { return -1; } } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值