Java基础——TreeSet
TreeSet是SortedSet接口的实现类,Sorted的英文意思是分类的;选择的。
TreeSet可以确保集合元素处于排序状态。与HashSet集合相比,TreeSet还提供了如下几个额外方法:
方法名称 | 解释 |
Comparator comparator(); | 如果TreeSet采用了定制排序,则该方法返回定制排序所使用Comparator;如果TreeSet采用了自然排序,则返回null; |
Object first(); | 返回集合中的第一个元素; |
Object last(); | 返回集合中的最后一个元素; |
Object lower(Object o); | 返回集合中位于指定元素之前的元素(即小于指定元素的最大元素,参考元素不需要是TreeSet集合里的元素); |
Object higher(Object o); | 返回集合中位于指定元素之后的元素(即大于指定元素的最小元素,参考元素不需要是TreeSet集合里的元素); |
SortedSet subSet(Object fromElement,Object toElement); | 返回此Set的子集合,返回从fromElement,Object (包含到)toElement(不包含); |
SortedSet headSet(Object toElement); | 返回此Set的子集,由小于toElement的元素组成; |
SortedSet tailSet(Object fromElement); | 返回此Set的子集,由大于或等于fromElement的元素组成; |
1 import java.util.Set; 2 import java.util.TreeSet; 3 4 public class TreeS { 5 public static void main(String[] args) { 6 Set<String> set = new TreeSet<String>();// 定义了泛型 7 set.add("Java"); 8 set.add("Js"); 9 set.add("PHP"); 10 set.add("C#"); 11 set.add("C++"); 12 set.add(".Net"); 13 // 打印集合 14 System.out.println(set); 15 16 // 输出集合的容量 17 System.out.println(set.size()); 18 19 // 如果此 set 不包含任何元素,则返回 true 20 System.out.println(set.isEmpty()); 21 22 } 23 }
output: [.Net, C#, C++, Java, Js, PHP] 6 false
与HashSet集合采用通过hash算法来决定元素的存储位置不同,TreeSet采用红黑树的数据结构来存储集合元素。
TreeSet支持两只排序方法:自然排序与自定义。
一、自然排序:
TreeSet会调用集合元素的compareTo(Object o)方法来比较元素之间的大小关系,然后将集合元素按升序排列,这种方式是自然排序。
Java提供了一个Comparable接口,该接口定义一个compareTo(Object o)方法,该方法返回一个整数值,实现该接口的类必须实现该方法,实现该接口的类的对象就可以比较大小。
例一&例二:
1 import java.util.TreeSet; 2 3 public class T { 4 public static void main(String[] args) { 5 6 // 例一:数字排序 7 /* 8 * TreeSet a = new TreeSet(); 9 * a.add(10); 10 * a.add(55); 11 * a.add(4); 12 * a.add(6); 13 * a.add(-1); 14 * a.add(-77); 15 * a.add(0); 16 * 17 * System.out.println(a);//打印:[-77, -1, 0, 4, 6, 10, 55] 18 */ 19 20 //例二:字母排序 21 TreeSet ts=new TreeSet(); 22 ts.add("b"); 23 ts.add("ee"); 24 ts.add("d"); 25 ts.add("abc"); 26 ts.add("ca"); 27 28 /* abc 29 b 30 c 31 ca 32 d 33 ee*/ 34 35 System.out.println(ts); //[abc, b, ca, d, ee] 36 } 37 }
例三:(下面这个例子没有写具体的比较规则。)
1 import java.util.Set; 2 import java.util.TreeSet; 3 4 class TreeS implements Comparable<Object> { 5 6 int score; 7 8 public TreeS(int score) { 9 this.score = score; 10 } 11 12 public int compareTo(Object o) { 13 return 1; 14 } 15 16 public boolean equals(Object obj) { 17 return true; 18 } 19 20 public static void main(String[] args) { 21 Set<Object> set = new TreeSet<Object>(); 22 23 // 计划在添加两个对象 24 set.add(new TreeS(77)); 25 set.add(new TreeS(7)); 26 27 System.out.println(set); 28 29 } 30 }
output: [TreeS@67064, TreeS@bcda2d]
例四:(这个例子为了引出自定义计较方法,其实已经用上一点了)
判断两个对象的是否相等的参照标准如下:
1 import java.util.Set; 2 import java.util.TreeSet; 3 4 class TreeS implements Comparable<Object> { 5 6 int score; 7 8 public TreeS(int score) { 9 this.score = score; 10 } 11 12 public int compareTo(Object o) { 13 TreeS d=(TreeS)o;//强制类型转换 14 return this.score>d.score? 1:this.score<d.score? -1:0; 15 } 16 17 public boolean equals(Object obj) { 18 if(this==obj){ 19 return true; 20 }else if(obj!=null&&obj.getClass()==TreeS.class){ 21 TreeS d=(TreeS)obj; 22 return d.score==this.score; 23 } 24 return false; 25 } 26 27 public static void main(String[] args) { 28 Set<Object> set = new TreeSet<Object>(); 29 30 // 计划在添加两个对象 31 set.add(new TreeS(77)); 32 set.add(new TreeS(77));//没有被打印 33 set.add(new TreeS(20)); 34 set.add(new TreeS(3)); 35 set.add(new TreeS(44)); 36 set.add(new TreeS(44));//没有被打印 37 set.add(new TreeS(6)); 38 set.add(new TreeS(-11)); 39 set.add(new TreeS(9)); 40 set.add(new TreeS(0)); 41 42 System.out.println(set); 43 44 } 45 }
output: [TreeS@97d01f, TreeS@e0a386, TreeS@feb48, TreeS@11ff436, TreeS@da3a1e, TreeS@11dba45, TreeS@b03be0, TreeS@2af081]
注意:
与HashSet类似的是,如果TreeSet中包含了可变对象,当可变对象的示例变量被修改时,TreeSet在处理这些对象时将非常复杂,而且容易出错。为了让程序更加健壮,推荐不要修改放入HashSet和TreeSet集合中元素的关键实例变量。
二、自定义排序
TessSet 的自然排序是根据集合元素的大小,TreeSet将它们以升序排列。如果需要实现定制排序,例如以降序排列,则可通过Comparator接口的帮助。
例一:
//使用TreeSet对学生考试成绩排序 //怎么做? //1 让对象实现 Comparable 接口 //2 然后重写compareTo 方法 //interface Comparable<T> Comparable 接口 //int compareTo(T o) Comparable接口中的方法 返回负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。 public class Student implements Comparable<Object>{int age;int score;String name;@Override //在自己重写的时候,先写上它,可以帮你报错public String toString(){return this.name+":"+this.age+":"+this.score;}public Student(int age,int score,String name){this.name=name;this.age=age;this.score=score;}@Override//用返回值是正数、负数或者零来判断大小public int compareTo(Object obj){if(!(obj instanceof Student)){throw new RuntimeException("输入的不是本类对象,请重新输入");}Student stu=(Student)obj;if(this.score>stu.score){return 1; //设置为是正数就行了}else if(this.score<stu.score){return -1;}else {//设置如果相等的例子,上面有个例子,相等的情况会丢失数据,这里要考虑到int result=this.name.compareTo(stu.name);if(result==0)return 1;return result;}}}
测试类:
import java.util.Iterator; import java.util.Set; import java.util.TreeSet;public class Test {public static void main(String[] args) {Set<Student> treeSet = new TreeSet<Student>();treeSet.add(new Student(11, 80, "李平"));treeSet.add(new Student(23, 40, "王芳"));treeSet.add(new Student(10, 60, "赵磊"));treeSet.add(new Student(12, 40, "王小二"));treeSet.add(new Student(10, 60, "马苗"));treeSet.add(new Student(18, 60, "马苗"));treeSet.add(new Student(25, 70, "姜浩"));Iterator<Student> it = treeSet.iterator();while (it.hasNext()) {Student stu = (Student) it.next();System.out.println(stu);}} }
例二:
//例子 往 treeset中放字符串,按字符串长度排序class MyComparator implements Comparator{@Overridepublic int compare(Object o1, Object o2) {Student stu1=(Student)o1;Student stu2=(Student)o2;if(stu1.score>stu2.score){return 10; //只要是正为数就行 }else if(stu1.score<stu2.score){return -10;}else{//return 0;return stu1.name.compareTo(stu2.name);}}}main 方法中 Set set=new TreeSet(new StrLenComparator());set.add("cc");set.add("b");set.add("dddddddd");set.add("kkkkkkkkkkk");set.add("v");set.add("ee");set.add("sssss");Iterator it2=set.iterator();while(it2.hasNext()){System.out.println(it2.next());}
例三:
附: 使用匿名类Set set=new TreeSet(new Comparator() { //这里使用了匿名类 @Overridepublic int compare(Object o1, Object o2) {String str1=(String)o1;String str2=(String)o2;if(str1.length()>str2.length()){return 1;}else if(str1.length()<str2.length()){return -1;}else{//return 0;return 1; //如果相等,反回1的目的,是怕丢数据 }}}
总结:
TreeSet是依靠TreeMap来实现的,所以是根据实现的Compareble接口或Comparator接口来判断元素是否重复,其排序与TreeMap一样。
转载于:https://www.cnblogs.com/1693977889zz/p/7094365.html
Java基础——TreeSet相关推荐
- [Java基础]TreeSet集合概述和特点
练习代码如下: package TreeSetPack;import java.util.TreeSet;public class TreeSetDemo {public static void ma ...
- java基础—TreeSet集合中储存自定义对象(java集合二)
TreeSet集合中储存学生对象,按照其年龄进行排序 TreeSet对元素进行排序的方式一: 让元素自身具备比较功能,元素就需要实现Comparable接口,覆盖compareTo方法. TreeSe ...
- Java基础-TreeSet与Java自定义类型的排序
TreeSet与Java自定义类型的排序 演示TreeSet对String是可排序的 TreeSet无法对自定义类型进行排序 比较规则怎么写 自平衡二叉树结构 实现比较器接口 Collections工 ...
- 【JAVA基础】HashSet、LinkedHashSet、TreeSet使用区别
[JAVA基础]HashSet.LinkedHashSet.TreeSet使用区别 HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放: LinkedHash ...
- Java基础学习系列--(五)【迭代器,数据结构,List,Set ,TreeSet集合,Collections工具类】
第一章 Iterator迭代器 1.1 Iterator接口 在程序开发中,经常需要遍历集合中的所有元素.针对这种需求,JDK专门提供了一个接口java.util.Iterator. 想要遍历Coll ...
- Java基础知识 21(Set集合,HashSet集合以及它的三种遍历方式(迭代器,增强for循环,forEach),LinkedHashSet集合,TreeSet集合(自然排序法,比较器排序法))
Java基础知识 21 Set集合 Set集合:一个不包含重复元素的Collection集合,元素不重复,List集合是允许元素重复的. Set接口的三个字类:HashSet(),LinkedHash ...
- java基础—自定义一个比较器,对TreeSet 集合中的元素按指定方法来排序(java集合六)
自定义一个比较器,对TreeSet 集合中的元素按指定方法来排序 import java.util.Comparator; import java.util.Iterator; import java ...
- java基础之—TreeSet集合学习笔记
TreeSet集合与HashSet集合一样存储元素唯一,但是TreeSet会对元素进行排序.TreeSet排序的原理:TreeSet底层是二叉树 (根据黑马的视频添加整理) //存入整数 public ...
- JAVA基础学习(十五)--集合二--TreeSet和泛型
一.TreeSet 1.1.TreeSet Set:hashSet:数据结构是哈希表.线程是非同步的. 保证元素唯一性的原理:判断元素的HashCode值是否相同. 如果相同,还会判断元素的equal ...
最新文章
- 使用laravel框架的eloquent\DB模型连接多个数据库
- C#编程利器之五:集合对象(Collections)
- 《循序渐进学Spark》一1.6 使用Spark Shell开发运行Spark程序
- sklearn官网-多分类问题
- 企业微信小程序_授权登录接口获取用户userid
- 在virtualenv中安装NumPy、 SciPy、 scikit-learn、 matplotlib
- windows7共享打印机无法连接0x00000bcb错误怎么解决
- 基于android的学生选课信息app
- idea打包jar,并运行
- 计算机磁盘空间分区管理,还在用Win10自带磁盘管理? 这款软件轻松管理分区!...
- wagtail 实现中英文
- 怎么看rx580是不是470刷的_rx580显卡看是不是刷的教程
- 虚拟变量陷阱原理及算例
- TLC固态硬盘暴力读写寿命测试
- 300多条MTK工作笔记为你的工作节省一半时间
- 量子计算 17 量子算法2 (量子Simon算法)
- 100多个免费API接口分享 调用完全不限次数,以后总用得着
- 督办管理系统项目总结
- java gps经纬度坐标转高德坐标_高德经纬度转普通GPS经纬度
- 中国交通运输发展白皮书