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
相关产品推荐
相关产品推荐

