2016年10月20日   码农之路   2,346 次浏览

以下是从百度引用过来的:

由于TreeMap需要排序,所以需要一个Comparator为键值进行大小比较.当然也是用Comparator定位的.
a. Comparator可以在创建TreeMap时指定
b. 如果创建时没有确定,那么就会使用key.compareTo()方法,这就要求key必须实现Comparable接口.
c. TreeMap是使用Tree搜索数据结构实现的,所以使用compare接口就可以完成定位了.

那么我们在使用Comparable接口时在某些情况下TreeSet数据会变少,这是什么原因产生的呢?
     public int compareTo(Object arg0) {
        Resource res = (Resource) arg0;
        return this. seq – res. seq;
    }
 
上面代码是最简单的compareTo实现方法,但是有时间将list中的数据放入treeset时,数据会丢失部分。
经过分析发现是因为treeset在调用compareTo时如果返回值为0,treeset就会认为比较的两个对象是同一个对象,从而丢弃掉一个对象。优化后的代码如下:
     public int compareTo(Object arg0) {
        Resource res = (Resource) arg0;
        if ( this. seq != res. seq) {
            return this. seq – res. seq;
        } else {
            return this. id.compareTo(res. id);
        }
    }
 
代码修改后会拿Resource对象的唯一值id进行比较,这样就能保证不同的对象id值永远不会相同,也就不会丢弃对象了。
赞 赏
申明:除非注明,本站文章均为原创,转载请以链接形式标明本文地址。 如有问题,请于一周内与本站联系,本站将在第一时间对相关内容进行处理。
本文地址: http://www.yyjjssnn.cn/articles/738.html

>>> Hello World <<<

这篇内容是否帮助到你了呢?

如果你有任何疑问或有建议留给其他朋友,都可以给我留言。

:wink: :twisted: :surprised: :smile: :smile9: :smile8: :smile7: :smile6: :smile5: :smile56: :smile55: :smile54: :smile53: :smile52: :smile51: :smile50: :smile4: :smile49: :smile48: :smile47: :smile46: :smile45: :smile44: :smile43: :smile42: :smile41: :smile40: :smile3: :smile39: :smile38: :smile37: :smile36: :smile35: :smile34: :smile33: :smile32: :smile31: :smile30: :smile2: :smile29: :smile28: :smile27: :smile26: :smile25: :smile24: :smile23: :smile22: :smile21: :smile20: :smile1: :smile19: :smile18: :smile17: :smile16: :smile15: :smile14: :smile13: :smile12: :smile11: :smile10: :smile0: :sad: :rolleyes1: :redface: :razz: :question: :neutral: :mrgreen: :mad: :lol: :idea: :exclaim: :evil: :eek: :cry: :cool: :confused: :biggrin: :arrow:

友情链接: 程序员刘杨 刘杨
Copyright 2003~2018 保留所有权利 | 网站地图
备案号:湘ICP备14001005号-2

湘公网安备 43011102001322号