java - 使用 Comparator 时 TreeMap 行为的 Submap()
问题描述
我正在研究 TreeMap。当我运行这段代码时,它给了我想要的结果。
TreeMap<String, Integer> dept = new TreeMap<>();
dept.put("Testing", 1);
dept.put("Training", 2);
dept.put("Automation", 3);
dept.put("Web Development", 4);
dept.put("Progamming", 5);
dept.put("Sales", 6);
dept.put("Housekeeping", 7);
SortedMap<String, Integer> subDept = dept.subMap("Sales","Training\0");
subDept.forEach( (name, id) -> System.out.println(name + " -> " + id));
输出:销售 -> 6 次测试 -> 1 次培训 -> 2
现在,我已将 TreeMap 更改为使用 Comparator 并尝试获取子图。
TreeMap<String, Integer> dept = new TreeMap<>(Comparator.reverseOrder());
SortedMap<String, Integer> subDept = dept.subMap("Training", "Sales\0");
但是,我得到的结果是
训练 -> 2 测试 -> 1
并不是
培训 -> 2 次测试 -> 1 次销售 -> 6
当使用反向比较器时,为什么不将 \0 附加到 submap 的第二个参数使其成为封闭范围?或者,我是否遗漏了代码中的某些内容?
解决方案
使用相反的顺序,"Sales\0"
出现在 之前"Sales"
。
附加\0
是一种仅适用于字符串的技巧,并且仅适用于按字典顺序排列的字符串。对于这种情况,您必须将字符串更改为按字典顺序排列在 . 之前的字符串Sales
,例如Saler
.
一个更容易和更强大的方法是使用提供的方法来获得一个封闭的范围:
dept.subMap("Training", true, "Sales", true)
推荐阅读
- jmeter - java.net.SocketException:软件导致连接中止:recv 失败 **确保浏览器设置为接受 JMeter 代理证书**
- c# - .netCore 如何从列表中将数据传递给控制器?
- r - ICC 在线性混合效应模型(多级模型、分层模型)中的 95% CI
- android - Flutter + BLOC + Moor
- vb.net - VB.NET“启用应用程序框架”并排组装
- c++ - 用另一个模板重载可变参数模板函数
- sql - Oracle 生成具有间隔的计划行
- javascript - 从 JavaScript 代码调用 Fetch 操作比从 react-native 调用它时慢很多
- ios - 从另一个文件快速调用视图控制器中的对象
- python - 更新熊猫数据帧子集的子集的值对于大型数据集来说太慢了