TreeSet两种比较
TreeSet底层数据结构是二叉树
判断对象是否一致是通过是对象自身有比较的方法,即使类实现Comparable接口,重写compareTo方法,自己定义比较规则,
若是不想用元素本身的比较方法,又不想修改代码,那么可以使集合自身具有比较的方法,就是在集合初始化时实现Comparator接口,即Set s =new TreeSet(new Mycomparetor implements Comparator).
比较过程优先使用comparator比较器。
/*
元素自身有比较性
*/
public class TreeSetTest {
public static void main(String[] args) {
Set s = new TreeSet();
s.add(new Person4("lisi",23));
s.add(new Person4("liiisi",20));
s.add(new Person4("lisi",21));
s.add(new Person4("wangwu",20));
// s.add(12);
System.out.println(s);
Iterator it = s.iterator();
while(it.hasNext()){
Person4 p1 =(Person4)it.next();
System.out.println(p1.getName()+"----"+p1.getAge());
}
}
}
class Person4 implements Comparable{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person4(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public int compareTo(Object o) {
if(!(o instanceof Person4)){
throw new RuntimeException("不是person对象");
}
Person4 p = (Person4)o;
System.out.println(this.name+"-----compareTo----"+p.name);
if(this.age==p.age){
return this.name.compareTo(p.name);
}
else
return new Integer(this.age).compareTo(new Integer(p.age));
}
}
/*
使用comparetor比较器
*/
public class TreeSetTest {
public static void main(String[] args) {
Set s = new TreeSet(new Mycomparator());
s.add(new Person4("lisi",23));
s.add(new Person4("liiisi",20));
s.add(new Person4("lisi",23));
s.add(new Person4("wangwu",20));
// s.add(12);
System.out.println(s);
Iterator it = s.iterator();
while(it.hasNext()){
Person4 p1 =(Person4)it.next();
System.out.println(p1.getName()+"----"+p1.getAge());
}
}
}
class Person4 {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person4(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
class Mycomparator implements Comparator{
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
if(!(o1 instanceof Person4)||!(o2 instanceof Person4))
throw new RuntimeException("比较对象中有不是Person4的元素");
Person4 p1 =(Person4)o1;
Person4 p2 =(Person4)o2;
System.out.println(p1.getName()+"---调用comparator--"+p2.getName());
if(p1.getAge()==p2.getAge())
return p1.getName().compareTo(p2.getName());
else
return p1.getAge()-p2.getAge();
}
}
TreeSet两种比较的更多相关文章
- TreeSet的两种实现方法:Comparable和Comparator(Java比较器)
Comparable与Comparator实际上是TreeSet集合的两种实现方式,用来实现对象的排序.下边介绍一下两种比较器的使用方法和区别. Comparable称为元素的自然顺序,或者叫做默认顺 ...
- Comparable和Comparator的区别&Collections.sort的两种用法
在Java集合的学习中,我们明白了: 看到tree,可以按顺序进行排列,就要想到两个接口.Comparable(集合中元素实现这个接口,元素自身具备可比性),Comparator(比较器,传入容器构造 ...
- Android中手机录屏并转换GIF的两种方式
之前在博文中为了更好的给大家演示APP的实现效果,本人了解学习了几种给手机录屏的方法,今天就给大家介绍两种我个人用的比较舒服的两种方法: (1)配置adb环境后,使用cmd命令将手机界面操作演示存为视 ...
- Web APi之认证(Authentication)两种实现方式【二】(十三)
前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...
- angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用
今天我们要讲的是ng2的路由系统. 例子
- angular2系列教程(六)两种pipe:函数式编程与面向对象编程
今天,我们要讲的是angualr2的pipe这个知识点. 例子
- 微信网页开发之获取用户unionID的两种方法--基于微信的多点登录用户识别
假设网站A有以下功能需求:1,pc端微信扫码登录:2,微信浏览器中的静默登录功能需求,这两种需求就需要用到用户的unionID,这样才能在多个登录点(终端)识别用户.那么这两种需求下用户的unionI ...
- Struts2实现ajax的两种方式
基于Struts2框架下实现Ajax有两种方式,第一种是原声的方式,另外一种是struts2自带的一个插件. js部分调用方式是一样的: JS代码: function testAjax() { var ...
- 分享两种实现Winform程序的多语言支持的解决方案
因公司业务需要,需要将原有的ERP系统加上支持繁体语言,但不能改变原有的编码方式,即:普通程序员感受不到编码有什么不同.经过我与几个同事的多番沟通,确定了以下两种方案: 方案一:在窗体基类中每次加载并 ...
随机推荐
- Ring3下干净的强行删除文件
在某公司实习完,再次回到寝室.还是在学校好. 实习期间的给我的任务就是为项目添加一个强行删除的模块. 背景是硬盘上存储空间不够时,需要删掉老的文件,如果这时后,老的文件被打开了,没有关掉,就无法删除. ...
- Hibernate get 和load的区别
1 load是要用的时候才从数据库去查询,get 是马上查询. 2 对于不存在的记录,get会报空指针异常,load会报 org.hibernate.ObjectNotFoundException: ...
- Android_Intent意图详解
本博文为子墨原创,转载请注明出处! http://blog.csdn.net/zimo2013/article/details/11863857 1.Intent作用 Intent是一个将要执行的动作 ...
- 假设说这个世界不是真实存在的,仅仅是一段代码,迄今为止你发现了哪些bug?
给这个世界写代码的不是一个人,而是一个团队(这么大的项目,一个人开发不了).并且严重怀疑这个一个开源项目.开发人员被我们觉得是神,所以一神论是不正确的,众神论才是真理,且凡人是有机会成为神的(參悟神道 ...
- C++ 文件操作实例
图1 文件个数及名称 图2 文件内容 背景:如图1所示,现有9个要处理的文件,每个文件的内容格式如图2所示,仅仅只是数值部分不同. 问题:如何提取每个文件中的相同属性的数值到同一个文件中? 输出示例: ...
- 用js获取周、月第一天和最后一天(转载)
var getCurrentWeek = function (day) { var days = ["周日", "周一", "周二", &q ...
- Oracle聚合求和和聚合求积(顺便解决BOM展开的问题)
本文参考网址:http://www.itpub.net/thread-1020772-1-1.html 我们在日常的工作中,经常遇到了针对某一列的值,进行求和,求平均值,在一些特殊的业务场景下,我们需 ...
- Java动态代理机制——JDK
动态代理机制是Spring AOP编程的原理基础. JDK的动态代理机制有个限制就是它只能代理实现了一个或多个接口的类.如PersonImpl得实现Person接口,才能用JDK动态代理机制. 定义一 ...
- 巧妙实现缺角radiogroup控制多个fragment切换和滑动
在android开发中,用一个radiogroup控制多个fragment切换是十分常见的需求.但是如果fragment是一个ListView,如何保证滑动的时候通过缺角可以看到下面的listview ...
- php功能---删除空目录
header('content-type:text/html;charset:utf-8'); function display($dir){ //判断是否是一个目录 if(!is_dir($dir) ...