发现了TreeMap的一个坑,自定义Comparator导致put不成功

当自定义Comparator对TreeMap的key排序时,如果两个key的comparator相同,即compare方法的返回值为0的时候,会出现一个坑,如下:

TreeMap<Integer,Integer> map = new TreeMap<Integer,Integer>((a, b) -> wgt[a] - wgt[b]);
for(int i = 0; i < wgt.length; i++) {
    map.put(i,weight[i]);  //当此次put的元素的wgt与之前某个相同时,此次put不会成功
    //System.out.println(map);
}

例如,当wgt = {0,0}时,打印结果如下:

{0=0}
{0=0}

而正确结果应为:

{0=0}
{0=0, 1=0}

正确的做法是,避免compare方法返回0,对两个key的comparator相同的情况进行处理,如下:

TreeMap<Integer,Integer> map = new TreeMap<Integer,Integer>((a, b) -> wgt[a] != wgt[b] ? wgt[a] - wgt[b] : a - b);
for(int i = 0; i < wgt.length; i++) {
    map.put(i,weight[i]);  //正确
}

这样就没有问题了。

你可能感兴趣的:(Java,数据结构)