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相关推荐

  1. [Java基础]TreeSet集合概述和特点

    练习代码如下: package TreeSetPack;import java.util.TreeSet;public class TreeSetDemo {public static void ma ...

  2. java基础—TreeSet集合中储存自定义对象(java集合二)

    TreeSet集合中储存学生对象,按照其年龄进行排序 TreeSet对元素进行排序的方式一: 让元素自身具备比较功能,元素就需要实现Comparable接口,覆盖compareTo方法. TreeSe ...

  3. Java基础-TreeSet与Java自定义类型的排序

    TreeSet与Java自定义类型的排序 演示TreeSet对String是可排序的 TreeSet无法对自定义类型进行排序 比较规则怎么写 自平衡二叉树结构 实现比较器接口 Collections工 ...

  4. 【JAVA基础】HashSet、LinkedHashSet、TreeSet使用区别

    [JAVA基础]HashSet.LinkedHashSet.TreeSet使用区别 HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放: LinkedHash ...

  5. Java基础学习系列--(五)【迭代器,数据结构,List,Set ,TreeSet集合,Collections工具类】

    第一章 Iterator迭代器 1.1 Iterator接口 在程序开发中,经常需要遍历集合中的所有元素.针对这种需求,JDK专门提供了一个接口java.util.Iterator. 想要遍历Coll ...

  6. Java基础知识 21(Set集合,HashSet集合以及它的三种遍历方式(迭代器,增强for循环,forEach),LinkedHashSet集合,TreeSet集合(自然排序法,比较器排序法))

    Java基础知识 21 Set集合 Set集合:一个不包含重复元素的Collection集合,元素不重复,List集合是允许元素重复的. Set接口的三个字类:HashSet(),LinkedHash ...

  7. java基础—自定义一个比较器,对TreeSet 集合中的元素按指定方法来排序(java集合六)

    自定义一个比较器,对TreeSet 集合中的元素按指定方法来排序 import java.util.Comparator; import java.util.Iterator; import java ...

  8. java基础之—TreeSet集合学习笔记

    TreeSet集合与HashSet集合一样存储元素唯一,但是TreeSet会对元素进行排序.TreeSet排序的原理:TreeSet底层是二叉树 (根据黑马的视频添加整理) //存入整数 public ...

  9. JAVA基础学习(十五)--集合二--TreeSet和泛型

    一.TreeSet 1.1.TreeSet Set:hashSet:数据结构是哈希表.线程是非同步的. 保证元素唯一性的原理:判断元素的HashCode值是否相同. 如果相同,还会判断元素的equal ...

最新文章

  1. 使用laravel框架的eloquent\DB模型连接多个数据库
  2. C#编程利器之五:集合对象(Collections)
  3. 《循序渐进学Spark》一1.6 使用Spark Shell开发运行Spark程序
  4. sklearn官网-多分类问题
  5. 企业微信小程序_授权登录接口获取用户userid
  6. 在virtualenv中安装NumPy、 SciPy、 scikit-learn、 matplotlib
  7. windows7共享打印机无法连接0x00000bcb错误怎么解决
  8. 基于android的学生选课信息app
  9. idea打包jar,并运行
  10. 计算机磁盘空间分区管理,还在用Win10自带磁盘管理? 这款软件轻松管理分区!...
  11. wagtail 实现中英文
  12. 怎么看rx580是不是470刷的_rx580显卡看是不是刷的教程
  13. 虚拟变量陷阱原理及算例
  14. TLC固态硬盘暴力读写寿命测试
  15. 300多条MTK工作笔记为你的工作节省一半时间
  16. 量子计算 17 量子算法2 (量子Simon算法)
  17. 100多个免费API接口分享 调用完全不限次数,以后总用得着
  18. 督办管理系统项目总结
  19. java gps经纬度坐标转高德坐标_高德经纬度转普通GPS经纬度
  20. 中国交通运输发展白皮书

热门文章

  1. 怎样改变java编码风格_如何说服同事修改些代码的风格(JAVA的)。。求指引
  2. 编程心得体会_CimatronE14高级五轴第三步,平行于曲线铣,会3轴编程更易理解
  3. 计算机桌面打开图像管理,如何给电脑桌面设置几张图片自动播放
  4. 如何使用加密芯片完成SHA1摘要运算
  5. Excel 求差集和并集
  6. linux后台运行命令和杀除命令
  7. 远离“数据呆” 对业务的理解和思考永远高于分析技术的选择
  8. 关于修改CentOS7(64位)环境变量
  9. PHP5.3x被弃用的函数及代替方法
  10. 基于类的软件复用技术