使用Comparator时TreeMap行为的Submap()

时间:2018-06-04 08:56:54

标签: java collections treemap

我正在开发一个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));
  

输出:销售 - &gt; 6测试 - &gt; 1培训 - &gt; 2

现在,我已经更改了TreeMap以获取Comparator并尝试获取子图。

TreeMap<String, Integer> dept = new TreeMap<>(Comparator.reverseOrder());
SortedMap<String, Integer> subDept = dept.subMap("Training", "Sales\0");

但是,我得到了结果

  

培训 - &gt; 2测试 - &gt; 1

而不是

  

培训 - &gt; 2测试 - &gt; 1销售 - &gt; 6

为什么在使用反向比较器时,不将\ 0附加到子图的第二个参数使其成为闭合范围?或者,我在代码中遗漏了什么?

1 个答案:

答案 0 :(得分:2)

如果排序相反,则"Sales\0"会出现在"Sales"之前。

追加\0是一种只适用于字符串的hack,只适用于字典顺序中的字符串。在这种情况下,您必须将字符串更改为按字典顺序排在Sales之前的字符串,例如Saler

更简单,更强大的方法是使用提供的方法获得封闭范围:

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