波波老师 2022-04-27 18:56 采纳率: 75%
浏览 66
已结题

new TreeSet(Comparator)去重是有bug吗?

问题遇到的现象和发生背景

不想重写对象的equals和hashcode方法,想直接通过new TreeSet(Comparator)进行对象去重,但发现去重不彻底

问题相关代码,请勿粘贴截图
public class Comment {
    private String dimensionKey;
    private String dimensionValue;
    private String indicatorsKey;
    private String indicatorsValue;
}

List<Comment> comments = new ArrayList<>();
        comments.add(Comment.builder().dimensionKey("2020").dimensionValue("1").indicatorsKey("1").indicatorsValue("30").build());
        comments.add(Comment.builder().dimensionKey("2020").dimensionValue("3").indicatorsKey("1").indicatorsValue("60").build());
        comments.add(Comment.builder().dimensionKey("2020").dimensionValue("1").indicatorsKey("1").indicatorsValue("10").build());
        comments.add(Comment.builder().dimensionKey("2020").dimensionValue("2").indicatorsKey("1").indicatorsValue("40").build());
        comments.add(Comment.builder().dimensionKey("2020").dimensionValue("2").indicatorsKey("1").indicatorsValue("50").build());
        comments.add(Comment.builder().dimensionKey("2020").dimensionValue("1").indicatorsKey("1").indicatorsValue("20").build());
        comments.add(Comment.builder().dimensionKey("2020").dimensionValue("3").indicatorsKey("1").indicatorsValue("70").build());
        comments.add(Comment.builder().dimensionKey("2020").dimensionValue("1").indicatorsKey("1").indicatorsValue("30").build());

        TreeSet<Comment> set = new TreeSet<>((a, b) -> {
            if (Objects.equals(a.getDimensionKey(), b.getDimensionKey()) &&
                    Objects.equals(a.getDimensionValue(), b.getDimensionValue()) &&
                    Objects.equals(a.getIndicatorsKey(), b.getIndicatorsKey())) {
                return 0;
            }
            return 1;
        });
        set.addAll(comments);
运行结果及报错内容

很明显,是想利用dimensionKey+dimensionValue+indicatorsKey这三个属性的组合去重,根据我造的数据,最终结果只有3个才对,但实际上出现了四个。

img

下面是运行结果,可以看到2020.1.1没有去重彻底

img

我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

4条回答 默认 最新

  • qq_25376897 2022-04-27 20:04
    关注

    你要想搞清楚这个问题,最好先了解TreeSet的底层实现,了解红黑树。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月29日
  • 已采纳回答 4月27日
  • 创建了问题 4月27日

悬赏问题

  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同