首页 > 解决方案 > 使用 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 的第二个参数使其成为封闭范围?或者,我是否遗漏了代码中的某些内容?

标签: javacollectionstreemap

解决方案


使用相反的顺序,"Sales\0"出现在 之前"Sales"

附加\0是一种仅适用于字符串的技巧,并且仅适用于按字典顺序排列的字符串。对于这种情况,您必须将字符串更改为按字典顺序排列在 . 之前的字符串Sales,例如Saler.

一个更容易和更强大的方法是使用提供的方法来获得一个封闭的范围:

dept.subMap("Training", true, "Sales", true)

推荐阅读