TreeMap踩坑

2023-09-02

java

不降志,不屈身,不追赶时髦,也不回避危险。──胡适

今天使用TreeMap踩坑了

代码如下:

1
2
3
4
5
6
7
8
    @Test
void test() {
Map<Integer, Object> map = new TreeMap<>(Comparator.comparing(i -> i % 2 == 0));
map.put(2, 0);
map.put(1, 0);
map.put(3, 0);
System.out.println(map);
}

输出结果却是

1
{1=0, 2=0}

这是因为Comparator里计算结果重复导致的,即便我们的key并不相同,也会被覆盖。。。

于是我们可以指定计算结果相同时策略:

1
2
3
4
5
6
7
8
9
@Test
void test() {
Map<Integer, Object> map = new TreeMap<>(Comparator.<Integer, Boolean>comparing(i -> i % 2 == 0).thenComparing(Comparator.naturalOrder()));
map.put(2, 0);
map.put(1, 0);
map.put(3, 0);
System.out.println(map);
}

结果:

1
{1=0, 3=0, 2=0}