当前位置: 首页 > news >正文

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;}@Overridepublic int compareTo(Person other) {return this.name.compareTo(other.name);  // 按名字排序}@Overridepublic 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());
}
http://www.lryc.cn/news/419480.html

相关文章:

  • 2024前端面试(内容持续更新)
  • 接口基础知识5:详解request headers(一篇讲完常见字段)
  • mac的node使用
  • HTML - 简易版打字练习
  • 【生成式人工智能-四-chatgpt的训练过程-pretrain预训练自督导式学习督导式学习】
  • 期权价格的奥秘:深入理解影响因素
  • STM32-USART时序与寄存器状态分析
  • 从零安装pytorch并在pycharm中使用
  • 开源AI工具FastGPT和RagFlow对比
  • 第N2周:NLP中的数据集构建
  • AI助力浮雕创作!万物皆可浮雕?Stable Diffusion AI绘画【浮雕艺术】之文生浮雕!
  • 你觉得大模型时代该出现什么?
  • JS【详解】事件委托
  • 谈对象系列:C++类和对象
  • 设计模式20-备忘录模式
  • 绘制echarts-liquidfill水球图
  • 应急响应:D盾的简单使用.
  • c语言第14天笔记
  • 服装行业QMS中的来料检验:常见问题解析与解决策略
  • 健身动作AI识别,仰卧起坐计数(含UI界面)
  • GitHub开源金融系统:Actual
  • 【学习笔记】Day 7
  • 网络中特殊的 IP 地址
  • ASP 表单处理入门指南
  • 极米RS10Plus性价比高吗?7款4-6K价位投影仪测评哪款最好
  • RocketMQ怎么对文件进行读写的?
  • 智慧宠物护理:智能听诊器引领健康监测新潮流
  • SRE工程师第2天:我只要截图功能 而不是打开微信
  • 【RunnerGo】离线安装成功版本
  • AI 手机的技术展望