TreeSet实现类,两种排序方法


集合特点:排序和唯一。

若传入的都是Integer类型的元素,TreeSet会自动排序
若传入的是对象,需要自定义排序方法

两种排序方式:

  1. 自然排序
  2. 比较器排序

使用元素的自然排序对元素进行排序,还是根据创建集合时提供的Comparator比较器进行排序,这取决于使用的构造方法。

真正比较的是依赖元素的compareTo()方法,而这个方法是定义在Comparable里面的。所以,你要想重写此方法。就必须是先实现Comparable接口。
由于在Integer类本身已实现了Comparable接口,重写了compare()方法,所以传入Integer类型的数时TreeSet实现类就会自动排序,而传入对象时,TreeSet实现类不知道以某种方式排序,此时就需要我们来从写排序方法。

Comparable接口:此接口强行对实现它的每个类的对象进行整体排序,这个排序称为自然排序。
Comparable接口的方法:intcompareTo(To)将此对象与指定的对象进行比较以进行排序。参数o-要比较的对象。结果负整数,零或正整数,因为该对象小于,等于或大于指定对象。

数据排序原理

元素是如何存储进去的?
TreeSet集合底层数据结构是红黑树(平衡二叉树)。
第一个元素存储的时候,直接作为根节点。
从第二个开始,每个元素从根节点开始比较:
大——就作为右孩子
小——就作为左孩子
相等——不搭理它
实例:

/*
 * TreeSet 唯一性,排序
 */
public class DeomeTreeSet {
   public static void main(String[] args) {
	//TreeSet 集合对象
	  TreeSet<Integer> ts =new TreeSet<Integer>();
	   ts.add(23);
	   ts.add(14);
	   ts.add(4);
	   ts.add(78);
	   ts.add(45);
	    //遍历
	   for (Integer itg:ts) {
		System.out.println(itg);
	 }   
	   
	   TreeSet<Stus > ts1 =new TreeSet<Stus>();
	   //创建元素对象
	   Stus s1 =new Stus("zhangsan",12);
	   Stus s2 =new Stus("lishi",15);
	   Stus s3 =new Stus("wangwu",16);
	   Stus s4 =new Stus("tianqi",19);
	   ts1.add(s1);
	   ts1.add(s2);
	   ts1.add(s3);
	   ts1.add(s4);
	  //遍历
   for (Stus itg:ts1) {
		System.out.println("姓名:"+itg.name+",年龄:"+itg.age);
	}   
 }
}
class Stus   {
	String name;
	int age;
	public Stus(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
}

运行结果:
在这里插入图片描述
如图显示:TreeSet可以实现integer类型的排序,但是对Stus类型的就没办法排序,因为计算机不知道以某种方式排序就会报错。
这时我们就要自定义排序方法。

第一种自然排序:

  1. 在类Stus中实现Comparable接口
  2. 重写Comparable接口中的Compareto方法
    如:修改类Stus实现Comparable()接口
class Stus implements Comparable<Stus>  {
	String name;
	int age;
	public Stus(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
   //重写compareTo方法
	@Override
	public int compareTo(Stus o) {
		//以年龄大小排序
		return this.age-o.age;
	}
}

在这里插入图片描述

第二种比较器排序:

比较器排序步骤:

  1. 单独创建一个比较类,这里以MyComparator为例,并且要让其继承
    Comparator接口
  2. 重写Comparator接口中的Compare方法
    intcompare(To1,To2)比较用来排序的两个参数
  3. 在主类中使用下面的构造
    TreeSet(Comparatorcomparator)
    构造一个新的空TreeSet,他根据指定比较器进行排序
    例如:
//写个工具类
class MyCompara implements Comparator<Stus>{
  @Override
  public int compare(Stus o1, Stus o2) {	
  	return o1.age-o2.age;
  }
}

之后再添加:
在这里插入图片描述
运行结果如上图.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值