import java.util.Comparator;
import java.util.TreeSet;
/*
 当treeset集合中的元素不具备比较功能,或者具备的比较功能不是所需要的
 例如person对象中的自然排序是按照年龄进行排序的,但现在的需求是按照姓名进行排序,改源代码的方式不可取
 
 该如果解决这个问题呢?
 既然元素具备的比较方式不满足应用,这时可以让集合自身具备比较性,需要集合一初始化就具备比较功能,因为要在
 添加元素前具备,就要在构造函数中进行初始化
 
 只要将一个实现了comparator接口的子类对象作为参数传递给treeset集合的构造函数即可,这样该集合就具备了比较功能
 
 treeset排序方式有两种
 第一种:让元素自身具备比较功能,其实就是让元素实现Comparable接口,覆盖compareTo方法,这称为元素的自然排序
 第二种:当元素自身不具备比较性,或者具备的比较性不是所需要的,这时可以让集合自身具备比较性
   定义一个比较器,其实就是定义一个类,实现Comparator接口,覆盖compare方法
   经Comparator接口的子类对象作为参数传递给treeset集合的构造函数
   
   当元素具备比较性,同时集合具有比较器时,以比较器为主
   
 建议使用第二种排序方式
 
 一般在描述一个对象时,如果该对象封装了具体的数据,会出现很多这样的对象,比如:员工,学生对象
 这时就需要进行容器的存储,那么描述该类对象时,就一定要复写几个方法:
 1.hashcode()
 2.equals()
 3.toString()
 4.最好实现Comparable接口,让该类实现自然排序功能
 
 建立对象自身判断是否相同的依据,同时让对象具备基本的比较性*/
public class TreeSetDemo{

/**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  TreeSet ts=new TreeSet(new CompareByName());
  ts.add(new Person("lisi3",20));
  ts.add(new Person("lisi4",21));
  ts.add(new Person("lisi6",29));
  ts.add(new Person("lisi9",23));
  ts.add(new Person("lisi1",25));
  
  System.out.println(ts);
 }

}
//自定义一个比较器
class CompareByName implements Comparator
{
 public int compare(Object o1,Object o2)
 {
  Person p1=(Person)o1;
  Person p2=(Person)o2;
  
  int num=p1.getName().compareTo(p2.getName());
  return num==0? p1.getAge()-p2.getAge():num;
 }
}
class Person implements Comparable
{
 String name;
 int age;
 Person(String name,int age)
 {
  this.name=name;
  this.age=age;
 }
 //人的自然排序是按照年龄进行排序
 public int compareTo(Object obj)
 {
  Person p=(Person)obj;
  //int num=this.age-p.age;
  int num=new Integer(this.age).compareTo(new Integer(p.age));
  return num==0? this.name.compareTo(p.name):num;
  /*if(this.age>p.age)
   return 1;
  else if(this.age<p.age)
   return -1;
  else
   return 0;*/
 }
 public int hashCode()
 {
  //System.out.println(this+".....hashCode");
  final int NUMBER=39;
  return name.hashCode()+age*NUMBER;
 }/**/
 public boolean equals(Object obj)
 {
  //System.out.println(this+"....equals...."+obj);
  if(this==obj)
   return true;
  if(!(obj instanceof Person))
   return false;
  Person p=(Person)obj;
  return this.name.equals(p.name) && this.age==p.age;
 }
 public String getName()
 {
  return name;
 }
 public int getAge()
 {
  return age;
 }
 public String toString()
 {
  return name+"::"+age;
 }
 
}

run:

[lisi1::25, lisi3::20, lisi4::21, lisi6::29, lisi9::23]

转载于:https://blog.51cto.com/asalinux/645740

TreeSet集合中的自定义比较器相关推荐

  1. 本实例演示往TreeSet集合中存储自定义对象

    1 package JiHe.Set; 2 3 import java.util.Iterator; 4 import java.util.TreeSet; 5 6 /* 7 * 本实例演示往Tree ...

  2. java基础—TreeSet集合中储存自定义对象(java集合二)

    TreeSet集合中储存学生对象,按照其年龄进行排序 TreeSet对元素进行排序的方式一: 让元素自身具备比较功能,元素就需要实现Comparable接口,覆盖compareTo方法. TreeSe ...

  3. java基础—自定义一个比较器,对TreeSet 集合中的元素按指定方法来排序(java集合六)

    自定义一个比较器,对TreeSet 集合中的元素按指定方法来排序 import java.util.Comparator; import java.util.Iterator; import java ...

  4. 集合中存储自定义对象源代码

    集合中存储自定义对象: package attention;import java.util.ArrayList; import java.util.Collection; import java.u ...

  5. TreeSet集合(自然排序和比较器排序)

    TreeSet集合 自然排序和比较器排序 ​ 当指执行插入排序.希尔排序.归并排序等算法时,比较两个对象"大小"的比较操作.我们很容易理解整型的 i>j 这样的比较方式,但当 ...

  6. Java中的TreeSet集合会自动将元素升序排序

    我们都知道,java中的集合可以分为这么两大类:Collection和Map ,其中Collection 接口中又可以派生出来两个接口,分别为:List和Set接口. 其中,Set下有HashSet, ...

  7. 【第17天】Java集合(四)---Sorted接口实现的TreeSet集合及单值类型集合总结

    1 TreeSet简介 2 基本用法与特点 3 制定单值比较规则 3.1 自然排序(compareTo(Object obj)) 3.2 定制排序(定义比较器类) 3.2.1 普通类内定义 3.2.2 ...

  8. Java基础学习系列--(五)【迭代器,数据结构,List,Set ,TreeSet集合,Collections工具类】

    第一章 Iterator迭代器 1.1 Iterator接口 在程序开发中,经常需要遍历集合中的所有元素.针对这种需求,JDK专门提供了一个接口java.util.Iterator. 想要遍历Coll ...

  9. java(五)-迭代器,数据结构,List,Set ,TreeSet集合,Collections工具类

    day05[迭代器,数据结构,List,Set ,TreeSet集合,Collections工具类] 主要内容 Collection集合的遍历方式: 迭代器. foreach(增强for循环) JDK ...

最新文章

  1. 【题解】已经没有什么好害怕的了
  2. Java线程的概念:什么是线程?
  3. android okio使用方法,Android 开源框架 Okio 原理剖析
  4. CentOS密码忘记后的操作
  5. Manacher 例题讲解
  6. A+B in Hogwarts (20)
  7. 相比于深度学习,传统的机器学习算法难道就此没落了吗,还有必要去学习吗?...
  8. 品高打造西科大教育云,带你看懂高教云建设之路
  9. 华为NP课程笔记5-中间系统到中间系统实验
  10. 中望cad自定义快捷键命令_[cad常用快捷键命令大全]中望cad常用快捷键及命令
  11. html新建文件夹,JS实现新建文件夹功能
  12. 计算机专业在线作图工具
  13. composer 安装php endroid/qrcode二维码应用,二维码里面添加logo
  14. 一元二次方程组求根问题
  15. iacr crypto 级别_缠论走势终完美:任何级别的所有走势,都能分解成盘整与趋势两种,而趋势又分上涨与下跌两种...
  16. Hrbust2294修建传送门(尺取法)
  17. 潇潇日暮时,掠水鸳鸯散。(01背包
  18. java写的表白小程序_Java实现表白小程序
  19. 基于微信疫苗预约小程序毕业设计毕设作品(7)中期检查报告
  20. Python中[m: ]、[ :n]、[m:n]、[m::n]的含义

热门文章

  1. android解析XML总结(SAX、Pull、Dom三种方式)
  2. 关于router name 的url重写 --frontname rewrite frontname重写!
  3. java项目皮肤包_java swing项目皮肤包+使用方法说明
  4. c语言多重括号,大佬在吗,我用C写了一个去多重括号的函数,结果。。。
  5. 用VS2017开发安卓应用
  6. php join a.id b.id,mysql求助 请问where a.id=b.id 和join on a.id=b.id 在效率上的区别
  7. 泰山服务器 oracle数据库,泰山之巅对话•Oracle数据库掌门人:领先对手10年?凭什么口气这么大?...
  8. php接口和java接口_java和php接口的区别是什么
  9. ux和ui_他们说,以UX / UI设计师的身份加入一家初创公司。 他们说,这会很有趣。
  10. 什么是设计模式_什么是设计?