TreeMap实现根据值比较

 前言:

TreeMap普通的排序方法都是根据键来比较来排序,本篇文章实现两种方式实现值排序

1.使用 SortedSet 和 Stream API

如果你想要一个持久化的排序结果,你可以使用 SortedSet 结构来存储键值对的条目。

TreeSet<Map.Entry<String, Person>> set = new TreeSet<>(Map.Entry.comparingByValue());

set.add(new AbstractMap.SimpleEntry<>("A", new Person("Alice", 25)));
set.add(new AbstractMap.SimpleEntry<>("B", new Person("Bob", 20)));
set.add(new AbstractMap.SimpleEntry<>("C", new Person("Charlie", 30)));

// 打印排序后的条目
for (Map.Entry<String, Person> entry : set) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}

这里的Map.Entry.comparingByValue() 方法是根据映射条目的值 (value) 进行排序。这个方法返回一个 Comparator 实例,该实例会比较 Map.Entry 对象中的值。

2. 使用反向映射

如果你只需要临时性的根据值进行排序,并且值的类型实现了 Comparable 接口或者你可以提供一个适当的 Comparator,那么可以创建一个反向映射,即把原来的键值对反转过来。

// 假设我们有一个 Person 类,其中的 name 属性实现了 Comparable 接口
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 name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public int compareTo(Person other) {
        return this.name.compareTo(other.name);  // 按名字排序
    }

    @Override
    public String toString() {
        return name + ":" + age;
    }
}

// 使用反向映射
TreeMap<String, Person> reverseMap = new TreeMap<>();

reverseMap.put("A", new Person("Alice", 25));
reverseMap.put("B", new Person("Bob", 20));
reverseMap.put("C", new Person("Charlie", 30));

// 打印反转后的映射
for (Map.Entry<String, Person> entry : reverseMap.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}

// 现在我们想按 Person 的 name 排序
TreeMap<Person, String> mapByValue = new TreeMap<>(Comparator.naturalOrder());

// 将键值对反转
for (Map.Entry<String, Person> entry : reverseMap.entrySet()) {
    mapByValue.put(entry.getValue(), entry.getKey());
}

// 打印按 Person 的 name 排序后的映射
for (Map.Entry<Person, String> entry : mapByValue.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TreeMap是一种基于红黑树实现的有序映射表,它的主要特点是可以快速地查找、插入和删除元素,并且按照键的自然顺序进行排序。 红黑树是一种自平衡二叉搜索树,它具有以下特点: 1. 每个节点要么是红色,要么是黑色。 2. 根节点是黑色的。 3. 每个叶子节点(NIL节点,空节点)是黑色的。 4. 如果一个节点是红色的,则它的两个子节点都是黑色的。 5. 对于每个节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数目的黑色节点。 在TreeMap中,每个节点包含一个键对,其中键是按照自然顺序排序的。插入一个新元素时,会先按照键的自然顺序找到其应该插入的位置,然后将其插入到红黑树中。如果新元素的键已经存在,则用新元素的覆盖原有元素的。 删除元素时,首先按照键的自然顺序找到要删除的元素,然后分三种情况进行处理: 1. 如果要删除的节点没有子节点,则直接删除该节点。 2. 如果要删除的节点只有一个子节点,则将该子节点替换为要删除的节点。 3. 如果要删除的节点有两个子节点,则找到该节点的前驱或后继节点来替换该节点。 TreeMap的时间复杂度分析如下: 1. 查找操作的时间复杂度为O(log n)。 2. 插入操作的时间复杂度为O(log n)。 3. 删除操作的时间复杂度为O(log n)。 总的来说,TreeMap是一种高效的实现有序映射表的数据结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值