波波老师 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 wincc已组态的变量过多
  • ¥60 如图:直线与椭圆X轴平行,求直线与椭圆任意一点的相切坐标计算公式
  • ¥50 如何用python使用opencv里的cv::cudacodec::VideoWriter函数对视频进行GPU硬编码
  • ¥100 c#solidworks 二次开发 工程图自动标边线法兰 等折弯尺寸怎么标
  • ¥15 halcon DrawRegion 提示错误
  • ¥15 FastAPI Uvicorn启动显示404
  • ¥15 centos7.9脚本,怎么排除特定的访问记录
  • ¥15 关于#Django#的问题:我的静态文件呢?
  • ¥15 关于CPLEX的问题,请专家解答
  • ¥15 cocos的点击事件 怎么穿透到 原生fragment上。