TreeSet集合类的重复判断标准

引言

大家都应该了解许多存储数据的容器了,对于我们程序猿来说,每天都要和它们打交道,今天要给大家介绍的TreeSet便是一种集合容器,它是Set接口的实现类。希望大家看了这篇文章后能有所收获。


存储数据的特点

  1. 不能添加重复元素,添加顺序和打印顺序不一致,但在容器内部是有特定的规则进行排序的。
  2. TreeSet容器对象:添加一种类型之后不能再添加其他类型(HashSet是不是也是这样呢?)

重复判断之自然排序

对于我们存储的数据,默认判断依据便是这种自然排序。自然排序是接口Comparable强行对它的每个实现类进行整体排序,在此我通过自定义类实现接口并覆写其中的compareTo方法讲述其实现原理。

  1. 我们的类必须是Comparable接口的实现类并提供字段和构造方法。如果不是的话运行会报异常,小伙伴们可以试一下(我们的常用类Integer,String等都是Comparable接口的实现类)。
    class Animals implements Comparable {
  2. 每次添加数据的时候都会调用我们覆写的compareTo方法,会根据返回值类型来判断我们所添加的数据是否重复。
  • 返回值为0判断重复,不添加数据
  • 返回值为1或-1,判断不重复,添加数据
@Override
	public int compareTo(Object o) {
		if( this==o ){//如果地址相同,当然是同一对象
			return 0;
		}
		} if( getClass() != o.getClass() ){//如果运行时类型不一致,肯定不是同一对象
			return -1;
		}
		Animals ani = (Animals) o;//需要将o强转成Animals才能访问字段属性。运用泛型的话此处可省略
		if(this.age > ani.age){
			return 1;
		}else if(this.age < ani.age){
			return -1;
		}else {
			return this.name.compareTo(ani.name);//String类中已经覆写了conpareTo方法,直接调用即可
		}
	}

重复判断之定制排序

当我们遇到只需要判断所添加对象的某个属性是否重复时,再使用默认的自然排序就会变得比较复杂,此时我们就需要用到定制排序。它有两种方式实现。

自定义类实现

  1. 首先需要自定义一个Comparator接口的实现类来定义我们的判断标准。
    注意:TreeSet只能添加同类型的数据,所以自定义的类和我们所添加数据对应的类是对应的。
    public class TeacherCompartor implements Comparator {
  2. 覆写抽象方法compare,这也是我们的判断标准(和我们所添加数据对应的类相关)
@Override
	public int compare(Object o1, Object o2) {
		Teacher t1 = (Teacher)o1;
		Teacher t2 = (Teacher)o2;
		return t1.name.compareTo(t2.name);
	}
  1. 构建我们的定制排序的集合容器
TeacherCompartor teacher = new TeacherCompartor();
TreeSet ts = new TreeSet(teacher);

这样我们的定制排序集合容器便完成了。

匿名内部类实现(推荐)

话不多说,上代码

//new Tree中需要我们传入Comparator类型数据,但是Comparator是个接口,所以我们可以试用匿名内部类实现(数据兼容)
TreeSet treeSet = new TreeSet(new Comparator() {//这是一个内部类
	@Override
	public int compare(Object o1, Object o2) {//覆写compare方法对象进行比较
		Student stu1 = (Student) o1;
		Student stu2 = (Student) o2;
		Integer age1 = new Integer(stu1.age);
		Integer age2 = new Integer(stu2.age);
		return age1.compareTo(age2);//转换成Integer之后,因为Integer是Comparable的实现类,直接调用compareTo方法
	}
});

我们的定制排序集合容器定义完毕,这是我初学java的第一个博客,小伙伴有什么不懂的或者我某些地方说错了的欢迎留下评论。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值