You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SortedSet(TreeSet)添加SQL查询构造的自定义对象时丢失部分元素问题

问题根因

元素添加丢失的核心诱因是TreeSet自定义比较器实现错误,与SQL查询逻辑、Pair自定义类本身无关。
TreeSet判定元素重复的唯一依据是绑定比较器的返回值:当两个元素经比较器计算返回0时,TreeSet会直接认定二者为重复元素,静默跳过新元素的add操作,整个过程不会调用元素类的equals、hashCode方法,也不会抛出任何异常。
当前实现的ComparatorGuildsRanking仅将公会活跃度积分作为唯一对比维度,只要两个公会积分值相同,比较结果就会返回0,直接被判定为重复。添加失败的"test"、"lilo"两个公会,积分值恰好与集合中已存在的其他公会积分完全一致,因此被过滤,不会出现在最终返回的集合中。

修复方案

调整比较器对比逻辑,在积分相等的场景下追加第二维度的唯一标识对比(比如公会名称),保证不同公会即使积分相同,比较结果也不会返回0。修正后的比较器实现如下:

public class ComparatorGuildsRanking implements Comparator<Pair_IntString> {
    @Override
    public int compare(Pair_IntString intStr1, Pair_IntString intStr2) {
        // 第一排序规则:活跃度积分倒序
        int pointCmpRes = intStr2.integer.compareTo(intStr1.integer);
        if (pointCmpRes != 0) {
            return pointCmpRes;
        }
        // 第二排序规则:公会名称字典序,避免同积分不同公会被判定为重复
        return intStr1.string.compareTo(intStr2.string);
    }
}

额外注意:现有数据库连接释放逻辑存在空指针风险,如果DataSource.getConnection()返回null,finally块中直接调用cn.close()会触发空指针异常,建议关闭连接前先判断连接对象非空。

内容的提问来源于stack exchange,提问作者Mithrandir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:57:37