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两种比较的更多相关文章

  1. TreeSet的两种实现方法:Comparable和Comparator(Java比较器)

    Comparable与Comparator实际上是TreeSet集合的两种实现方式,用来实现对象的排序.下边介绍一下两种比较器的使用方法和区别. Comparable称为元素的自然顺序,或者叫做默认顺 ...

  2. Comparable和Comparator的区别&Collections.sort的两种用法

    在Java集合的学习中,我们明白了: 看到tree,可以按顺序进行排列,就要想到两个接口.Comparable(集合中元素实现这个接口,元素自身具备可比性),Comparator(比较器,传入容器构造 ...

  3. Android中手机录屏并转换GIF的两种方式

    之前在博文中为了更好的给大家演示APP的实现效果,本人了解学习了几种给手机录屏的方法,今天就给大家介绍两种我个人用的比较舒服的两种方法: (1)配置adb环境后,使用cmd命令将手机界面操作演示存为视 ...

  4. Web APi之认证(Authentication)两种实现方式【二】(十三)

    前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...

  5. angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

    今天我们要讲的是ng2的路由系统. 例子

  6. angular2系列教程(六)两种pipe:函数式编程与面向对象编程

    今天,我们要讲的是angualr2的pipe这个知识点. 例子

  7. 微信网页开发之获取用户unionID的两种方法--基于微信的多点登录用户识别

    假设网站A有以下功能需求:1,pc端微信扫码登录:2,微信浏览器中的静默登录功能需求,这两种需求就需要用到用户的unionID,这样才能在多个登录点(终端)识别用户.那么这两种需求下用户的unionI ...

  8. Struts2实现ajax的两种方式

    基于Struts2框架下实现Ajax有两种方式,第一种是原声的方式,另外一种是struts2自带的一个插件. js部分调用方式是一样的: JS代码: function testAjax() { var ...

  9. 分享两种实现Winform程序的多语言支持的解决方案

    因公司业务需要,需要将原有的ERP系统加上支持繁体语言,但不能改变原有的编码方式,即:普通程序员感受不到编码有什么不同.经过我与几个同事的多番沟通,确定了以下两种方案: 方案一:在窗体基类中每次加载并 ...

随机推荐

  1. [Leetcode][Python]24: Swap Nodes in Pairs

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 24: Swap Nodes in Pairshttps://oj.leetc ...

  2. ocx控件获取使用App的窗口句柄

    在CXxxCtrl文件中 HWND hAppWnd = NULL; if (m_pInPlaceSite != NULL) m_pInPlaceSite->GetWindow(&hApp ...

  3. nodejs开发微信1——微信路由设置a(access_token和tickets)

    /* jshint -W079 */ /* jshint -W020 */ "use strict"; var _ = require("lodash"); v ...

  4. Labeling Balls(拓扑排序wa)

    Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12466   Accepted: 3576 D ...

  5. ECSHOP 模版文件里的编辑区域

    Ecshop 中的模板能够有可编辑区域,在模板中是通过 <!-- TemplateBeginEditable name="左边区域" --> <!-- Templ ...

  6. getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()的作用

    getCacheDir()方法用于获取/data/data/<application package>/cache目录 getFilesDir()方法用于获取/data/data/< ...

  7. JavaScript之面向对象学习四原型对象的动态性

    1.由于在原型中查找值的过程是一次搜索,因此我们对原型对象所做的任何修改都能够立即从实例上反映出来---即便是先创建了实例后修改原型也是如此.代码如下: function Person(){ } va ...

  8. Linux分区方案

    创建三个分区 1./boot     启动分区     存放内核和启动程序                   空间分配:100M     类型:ext4 2./swap     交换分区     虚 ...

  9. js判断年龄是否在0-100之间

    //判断年龄 $('#info_age').change(function(){ var _val = $(this).val(); -]+$/.test( _val ))||_val< || ...

  10. sql语句中特殊函数的用法

    1.concat CONCAT(字串1, 字串2, 字串3, ...): 将字串1.字串2.字串3,等字串连在一起. 例如: Geography 表格 region_name     store_na ...