TreeSet集合中的自定义比较器
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集合中的自定义比较器相关推荐
- 本实例演示往TreeSet集合中存储自定义对象
1 package JiHe.Set; 2 3 import java.util.Iterator; 4 import java.util.TreeSet; 5 6 /* 7 * 本实例演示往Tree ...
- java基础—TreeSet集合中储存自定义对象(java集合二)
TreeSet集合中储存学生对象,按照其年龄进行排序 TreeSet对元素进行排序的方式一: 让元素自身具备比较功能,元素就需要实现Comparable接口,覆盖compareTo方法. TreeSe ...
- java基础—自定义一个比较器,对TreeSet 集合中的元素按指定方法来排序(java集合六)
自定义一个比较器,对TreeSet 集合中的元素按指定方法来排序 import java.util.Comparator; import java.util.Iterator; import java ...
- 集合中存储自定义对象源代码
集合中存储自定义对象: package attention;import java.util.ArrayList; import java.util.Collection; import java.u ...
- TreeSet集合(自然排序和比较器排序)
TreeSet集合 自然排序和比较器排序 当指执行插入排序.希尔排序.归并排序等算法时,比较两个对象"大小"的比较操作.我们很容易理解整型的 i>j 这样的比较方式,但当 ...
- Java中的TreeSet集合会自动将元素升序排序
我们都知道,java中的集合可以分为这么两大类:Collection和Map ,其中Collection 接口中又可以派生出来两个接口,分别为:List和Set接口. 其中,Set下有HashSet, ...
- 【第17天】Java集合(四)---Sorted接口实现的TreeSet集合及单值类型集合总结
1 TreeSet简介 2 基本用法与特点 3 制定单值比较规则 3.1 自然排序(compareTo(Object obj)) 3.2 定制排序(定义比较器类) 3.2.1 普通类内定义 3.2.2 ...
- Java基础学习系列--(五)【迭代器,数据结构,List,Set ,TreeSet集合,Collections工具类】
第一章 Iterator迭代器 1.1 Iterator接口 在程序开发中,经常需要遍历集合中的所有元素.针对这种需求,JDK专门提供了一个接口java.util.Iterator. 想要遍历Coll ...
- java(五)-迭代器,数据结构,List,Set ,TreeSet集合,Collections工具类
day05[迭代器,数据结构,List,Set ,TreeSet集合,Collections工具类] 主要内容 Collection集合的遍历方式: 迭代器. foreach(增强for循环) JDK ...
最新文章
- 【题解】已经没有什么好害怕的了
- Java线程的概念:什么是线程?
- android okio使用方法,Android 开源框架 Okio 原理剖析
- CentOS密码忘记后的操作
- Manacher 例题讲解
- A+B in Hogwarts (20)
- 相比于深度学习,传统的机器学习算法难道就此没落了吗,还有必要去学习吗?...
- 品高打造西科大教育云,带你看懂高教云建设之路
- 华为NP课程笔记5-中间系统到中间系统实验
- 中望cad自定义快捷键命令_[cad常用快捷键命令大全]中望cad常用快捷键及命令
- html新建文件夹,JS实现新建文件夹功能
- 计算机专业在线作图工具
- composer 安装php endroid/qrcode二维码应用,二维码里面添加logo
- 一元二次方程组求根问题
- iacr crypto 级别_缠论走势终完美:任何级别的所有走势,都能分解成盘整与趋势两种,而趋势又分上涨与下跌两种...
- Hrbust2294修建传送门(尺取法)
- 潇潇日暮时,掠水鸳鸯散。(01背包
- java写的表白小程序_Java实现表白小程序
- 基于微信疫苗预约小程序毕业设计毕设作品(7)中期检查报告
- Python中[m: ]、[ :n]、[m:n]、[m::n]的含义
热门文章
- android解析XML总结(SAX、Pull、Dom三种方式)
- 关于router name 的url重写 --frontname rewrite frontname重写!
- java项目皮肤包_java swing项目皮肤包+使用方法说明
- c语言多重括号,大佬在吗,我用C写了一个去多重括号的函数,结果。。。
- 用VS2017开发安卓应用
- php join a.id b.id,mysql求助 请问where a.id=b.id 和join on a.id=b.id 在效率上的区别
- 泰山服务器 oracle数据库,泰山之巅对话•Oracle数据库掌门人:领先对手10年?凭什么口气这么大?...
- php接口和java接口_java和php接口的区别是什么
- ux和ui_他们说,以UX / UI设计师的身份加入一家初创公司。 他们说,这会很有趣。
- 什么是设计模式_什么是设计?