Java TreeSet类的简单理解和使用
这篇文章主要介绍了JavaTreeSet类的简单理解和使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
TreeSet类是Set接口的一个实现类,主要作用是用于对对象的排序以及确定存入对象的唯一性。给对象排序的方式有很多,比如一些基本类型int、String等类型就已经提供了很多排序的方法了,但是这并不说明TreeSet类就没有什么用了。在一些时候我们需要自定义一些类,同时需要对这个类的对象进行排序,那么这个时候我们就可以通过这个TreeSet类去自定义一个排序的条件。
现在通过一个简单的案例实现来实现这个排序和唯一性
首先自定义一个Student类,类里面有三个属性,分别是姓名、学号、年龄
publicclassStudent{ privateStringname; privateStringnum; privateintage; Student(Stringname,Stringnum,intage){ this.name=name; this.num=num; this.age=age; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicStringgetNum(){ returnnum; } publicvoidsetNum(Stringnum){ this.num=num; } publicintgetAge(){ returnage; } publicvoidsetAge(intage){ this.age=age; } }
然后我们给这个类的三个属性添加值,并且将类的实例化对象添加到TreeSet类中。
注意:TreeSet类是没有get方法的,要输出里面的内容得通过foreach循环或者迭代器输出,如果直接通过print进行输出,显示的是内存地址对象。
然后我们来看下输出结果
importjava.util.Iterator; importjava.util.Set; publicclassTreeSet{ publicstaticvoidmain(String[]args){ Students1=newStudent("张珊","111213",18); Students2=newStudent("隔壁","111215",19); Students3=newStudent("翠花","111214",12); Students4=newStudent("老王","111212",11); Students5=newStudent("老黑","111212",11); Setset=newjava.util.TreeSet(); set.add(s1); set.add(s2); set.add(s3); set.add(s4); set.add(s5); //通过迭代器输出结果 Iteratoriterator=set.iterator(); while(iterator.hasNext()){ Studento=(Student)iterator.next(); System.out.println(o.getName()); } } }
可以看到无法正常输出,报错。这里报错的原因是类型转换错误。因为将对象存入TreeSet类中时需要对对象进行一个比较,第一次存入时因为没有可对比的对象,所以不会报错,但是当第二个对象存入时需要同第一个对象进行比较,再决定在二叉树中存放的位置。这里的比较方法需要我们自己去实现Comparable<>接口重写一个compareTo()方法。
那么现在在自定义Student类中实现Comparable并且重现compareTo()方法
publicclassStudentimplementsComparable{ privateStringname; privateStringnum; privateintage; Student(Stringname,Stringnum,intage){ this.name=name; this.num=num; this.age=age; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicStringgetNum(){ returnnum; } publicvoidsetNum(Stringnum){ this.num=num; } publicintgetAge(){ returnage; } publicvoidsetAge(intage){ this.age=age; } @Override publicintcompareTo(Studento){ //通过年龄的比较确定存放顺序 returnthis.age-o.age; } }
现在看下输出结果
可以看到存入的内容可以正常输出的了,但是老黑没有输出,这是因为老黑和老王的年龄相同,而我们重写的compareTo()方法中的比较条件就是年龄。下面来看看这个方法中的返回值的含义。
@Override publicintcompareTo(Studento){ return0;return1; return-1; }
compareTo()方法的返回值类型是int类型,在这里只存在三种情况,分别是:大于0,小于0,和等于0。
TreeSet的底层结构是一个二叉树,每次插入的对象都会根据二叉树的结构进行排列。当前后两个对象的条件进行比较返回正数时,后一个对象会存在已前一个对象为根的右节点;当前后两个对象的条件进行比较返回负数时,后一个对象会存在已前一个对象为根的左节点;当前后两个对象的条件进行比较返回0时,后一个对象不存入TreeSet中。因为老黑和老王年龄相同,所以这里名字为老黑的对象就不存入了。
存入TreeSet中的对象输出的顺序是按照二叉树的中序进行输出的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。