昨天在写一个题目其中一块的任务是:将一些字符串去重,并且按给你时候的顺序输出出来,我没有想到用LinkedHashSet,第一想到的是使用TreeSet,故构造一个带comparator的treeset,让俩东西相等时候输出0,表示重复,那么treeset应该会不添加这个新元素,其余情况输出1表示直接添加到末尾,不做交换。然鹅实际情况与我想象的不一样,重复元素出现在特定位置时候无法去除(这一部分我通过debug 自己定义的compartatoro1,o2进行了对比已经证实comparator书写正确,是没有进行全遍历而造成的无法识别重复)。为了简单复现这个问题,我书写了加入简单integer类型的treeset,代码如下public class Tree {
public static void main(String[] args) {
TreeSet<Integer> treeSet = new TreeSet<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
if(o1.equals(o2))
{
return 0;
}
return 1;
}
});
treeSet.add(1);
treeSet.add(2);
treeSet.add(3);
treeSet.add(1);
treeSet.add(4);
treeSet.add(1);
treeSet.add(5);
treeSet.add(7);
treeSet.add(1);
treeSet.add(6);
treeSet.add(7);
treeSet.add(1);
for(int i : treeSet)
{
System.out.println(i);
}
}
}这个代码也许你以为会输出1,2,3,4,5,7,6但是实际情况是12314576根据debug结果可以发现在加入第二个1时候(也就是加入这个1之前是1,2,3),这时候我认为加入1之后o1一直作为1,去和剩余3个元素作对比,如果重复就不会添加,然鹅实际情况再一次不同,o1一直作为1,也就是新添加的元素,只与2,3做了对比(也就是o2元素只遍历了2,3这两个)就结束了,程序发现并没有重复,因为根本就没看开头位置的东西是1,当然认为无重复,就把1又加了进去。这个同理可以验证到字符串上面,并且更多的试验表明在总长超过6之后下标为2的元素也不会被o2遍历到。小弟长时间自己思考,百度源码结论都应该是冒泡逐个遍历,但是并没能解决,还请各位老师指点一二。非常感谢!
添加回答
举报
0/150
提交
取消