TreeSet(一)

一、TreeSet定义:

     与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的。     
      1)TreeSet类概述
        使用元素的自然顺序对元素进行排序
        或者根据创建 set 时提供的 Comparator 进行排序
        具体取决于使用的构造方法。 
     2)TreeSet是如何保证元素的排序和唯一性的
        底层数据结构是红黑树(红黑树是一种自平衡的二叉树)
 
  (1)  自然排序
  1. import java.util.TreeSet;
  2.  
  3. /** TreeSet集合的特点:排序和唯一
  4. *
  5. * 通过观察TreeSet的add()方法,我们知道最终要看TreeMap的put()方法。
  6. */
  7. public class TreeTest1 {
  8. public static void main(String[] args) {
  9. // 创建集合对象
  10. // 自然顺序进行排序
  11. TreeSet<Integer> treeSet = new TreeSet<Integer>();
  12. // 创建元素并添加
  13. treeSet.add(8);
  14. treeSet.add(4);
  15. treeSet.add(5);
  16. treeSet.add(6);
  17. treeSet.add(6);
  18. // 遍历
  19. for(Integer i : treeSet){
  20. System.out.print(i);
  21. }
  22. }
  23. }
  24. /*后台输出:4568 重复会被覆盖*/

(2)如果存入对象怎么排序,记住如果是对象一定要重写Comparator方法

  People对象

  1. public class People implements Comparable {
  2.  
  3. private String name;
  4. private String sex;
  5. private int age;
  6.  
  7. /*提供set和get方法,全参和无参构造方法*/
  8.  
  9. @Override
  10. public int compareTo(Object o) {
  11.  
  12. People people = (People) o;
  13. if (people.age > this.age) {
  14.  
  15. return 1;
  16. }
  17. if (this.age == people.age) {
  18.  
  19. return this.name.compareTo(people.name);
  20. }
  21. if ( people.age<this.age ) {
  22.  
  23. return -1;
  24. }
  25.  
  26. return 0;
  27. }
  28. }

测试类

  1. public class SortTest {
  2.  
  3. public static void main(String[] args) {
  4.  
  5. People people1 = new People("小a", "男", 18);
  6. People people2 = new People("小a", "女", 16);
  7. People people3 = new People("小c", "女", 18);
  8. People people4 = new People("小b", "女", 22);
  9. People people5 = new People("小d", "男", 19);
  10.  
  11. Set<People> treeSet = new TreeSet<People>();
  12.  
  13. treeSet.add(people1);
  14. treeSet.add(people2);
  15. treeSet.add(people3);
  16. treeSet.add(people4);
  17. treeSet.add(people5);
  18.  
  19. Iterator iterator = treeSet.iterator();
  20.  
  21. while (iterator.hasNext()) {
  22.  
  23. People people = (People) iterator.next();
  24.  
  25. System.out.println("姓名:" + people.getName() + "\t年龄:" + people.getAge());
  26. }
  27.  
  28. }
  29. }
运行结束:后台报错:
Exception in thread "main" java.lang.ClassCastException: com.treeset.sort.People cannot be cast to java.lang.Comparable

(3)举例一个学生有语文、数学、 英语三门课,按总分从高到底排序
     Student对象
  1. public class Student {
  2.  
  3. private String name;
  4. private int chinese;
  5. private int math;
  6. private int english;
  7.  
  8. /*提供set和get方法,同时提供无参数,有参数构造方法*/
  9.  
  10. //同时单独要加上getSum方法
  11. public int getSum(){
  12. return this.chinese + this.english + this.math;
  13. }
  14. }

测试类

  1. import java.util.Iterator;
  2. import java.util.TreeSet;
  3.  
  4. public class TreeTest2 {
  5.  
  6. public static void main(String[] args) {
  7.  
  8. Student student1=new Student("小明", 80, 90, 70);
  9. Student student2=new Student("小王", 60, 80, 90);
  10. Student student3=new Student("小钱", 100, 100, 80);
  11. Student student4=new Student("小徐", 20, 10, 90);
  12. Student student5=new Student("小李", 80, 80, 80);
  13. Student student6=new Student("小李", 70, 80, 90);
  14.  
  15. TreeSet<Student> treeSet=new TreeSet(new MyComparable());
  16.  
  17. treeSet.add(student1);
  18. treeSet.add(student2);
  19. treeSet.add(student3);
  20. treeSet.add(student4);
  21. treeSet.add(student5);
  22. treeSet.add(student6);
  23.  
  24. Iterator<Student> iterator=treeSet.iterator();
  25.  
  26. while(iterator.hasNext()){
  27.  
  28. Student student=iterator.next();
  29.  
  30. System.out.println(student.toString());
  31. }
  32. }
  33. }

MyComparable类

  1. import java.util.Comparator;
  2.  
  3. public class MyComparable implements Comparator<Student>{
  4.  
  5. @Override
  6. public int compare(Student s1, Student s2) {
  7.  
  8. // 总分从高到低(注意这里是s2减s1)
  9. int num = s2.getSum() - s1.getSum();
  10.  
  11. if(num>0){
  12. return 1;
  13. }
  14. if(num<0){
  15. return -1;
  16. }
  17.  
  18. if(num==0){
  19. //这步非常关键,没有这个如果总成绩相同名字不同 ,那set集合就默认是相同元素,就会被覆盖掉
  20. return s2.getName().compareTo(s1.getName());
  21. }
  22. return 0;
  23. }
  24. }

  1. /**
  2. * 是不是很奇怪为什么只有五条数据,而不是六条,那是因为有一条数据被覆盖了。
  3. * 你的Comparator实现类,是先比较成绩,成绩相同,在比较名字,那如果总成绩
  4. * 相同,姓名也相同,那不是默认是重复数据,TreeSet当然给你覆盖掉了。所以这
  5. * 里有个小李被覆盖掉了。那如何写才规范,下面这样就不会出现覆盖。
  6. */
  7. @Override
  8. // 创建一个TreeSet集合
  9. public int compare(Student s1, Student s2) {
  10. // 总分从高到低(注意这里是s2减s1)
  11. int num = s2.getSum() - s1.getSum();
  12. // 总分相同的不一定语文相同
  13. int num2 = num == 0 ? s1.getChinese() - s2.getChinese() : num;
  14. // 总分相同的不一定数学相同
  15. int num3 = num2 == 0 ? s1.getMath() - s2.getMath() : num2;
  16. // 总分相同的不一定英语相同
  17. int num4 = num3 == 0 ? s1.getEnglish() - s2.getEnglish() : num3;
  18. // 姓名还不一定相同
  19. int num5 = num4 == 0 ? s1.getName().compareTo(s2.getName()) : num4;
  20. return num5;
  21. }
       最后在思考,set集合在开发中到底有啥用,好像我们开发当中要用集合一般会用ArrayList,好像很少用到TreeSet集合
      这个时候你就要想TreeSet集合的特点了:排序和唯一
 
 举个小例子:
     (4) 编写一个程序,获取10个1至20的随机数,要求随机数不能重复。
  1. import java.util.Iterator;
  2. import java.util.TreeSet;
  3. import java.util.Random;
  4. /*
  5. * 编写一个程序,获取10个1至20的随机数,要求随机数不能重复。
  6. *
  7. * 分析:
  8. * A:创建随机数对象
  9. * B:创建一个TreeSet集合
  10. * C:判断集合的长度是不是小于10
  11. * 是:就创建一个随机数添加
  12. * 否:不搭理它
  13. * D:遍历TreeSet集合
  14. */
  15. public class HashSetDemo {
  16. public static void main(String[] args) {
  17. // 创建随机数对象
  18. Random r = new Random();
  19. // 创建一个Set集合
  20. TreeSet<Integer> treeSet = new TreeSet<Integer>();
  21. // 判断集合的长度是不是小于10
  22. while (treeSet.size() < 10) {
  23. int x = r.nextInt(20) + 1;
  24. treeSet.add(x);
  25. }
  26. // 遍历Set集合
  27. for (int x : treeSet) {
  28. System.out.println(x);
  29. }
  30. }
  31. }
     用这个例子,希望你能有扩散你的思维,也应该知道在什么时候用TreeSet集合了。
 
     
     水滴石穿,成功的速度一定要超过父母老去的速度! 少尉【1】
 
 
 
 

TreeSet(一)--排序的更多相关文章

  1. Java TreeSet集合排序 && 定义一个类实现Comparator接口,覆盖compare方法 && 按照字符串长度排序

    package TreeSetTest; import java.util.Iterator; import java.util.TreeSet; import javax.management.Ru ...

  2. TreeSet集合排序方式一:自然排序Comparable

    TreeSet集合默认会进行排序.因此必须有排序,如果没有就会报类型转换异常. 自然排序 Person class->实现Comparable,实现compareTo()方法 package H ...

  3. Comparator与Comparable,自定义排序和类比较器,TreeSet对象排序

    /** * 学生类 * @author Administrator * */ public class Student { private String sno ; private String sn ...

  4. TreeSet 比较器排序 自定义对象

    package cn.itcast.day21.treeset2; import java.util.Comparator; import java.util.TreeSet; /* * TreeSe ...

  5. TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?

    TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小.TreeMap要求存放的键值对映射的键必 ...

  6. TreeMap和TreeSet在排序时如何比较元素,Collections工具类中的sort()方法如何比较元素

    TreeSet和TreeMap排序时比较元素要求元素对象必须实现Comparable接口 Collections的sort方法比较元素有两种方法: 元素对象实现Comparable接口 实体类Dog ...

  7. java TreeSet的排序之定制排序

    TreeSet的自然排序是根据元素的大小进行升序排序的,若想自己定制排序,比如降序排序,就可以使用Comparator接口了: 该接口包含int compare(Object o1,Object o2 ...

  8. java TreeSet的排序之自然排序

    TreeSet会调用元素的compareTo(Object o)方法来比较元素之间的大小关系,然后将集合里的元素按升序排列.此时需要排序元素的类必须实现Compareble接口,并覆写其int com ...

  9. TreeSet集合排序方式二:定制排序Comparator

    Comparator有两种实现方式: 1,匿名内部类 2,创建一个类用于实现Comparator,该类创建的对象就是比较器 Person类 public class Person implements ...

随机推荐

  1. python异步并发模块concurrent.futures入门详解

    concurrent.futures是一个非常简单易用的库,主要用来实现多线程和多进程的异步并发. 本文主要对concurrent.futures库相关模块进行详解,并分别提供了详细的示例demo. ...

  2. Oracle官方非托管Odac驱动与Oracle官方托管odac驱动

    方便自己,方便他人,记一次连接oracle的经历,使用 [Oracle官方非托管Odac驱动,Oracle.DataAccess.Client]连接数据库的时候程序会报错,找了很久都不知道是什么原因, ...

  3. 前端开发:如何写一手漂亮的 Vue

    前几日听到一句生猛与激励并存,可怕与尴尬同在,最无奈也无解的话:"90后,你的中年危机已经杀到".这令我很受触动.显然,这有些夸张了,但就目前这日复一日的庸碌下去,眨眼的功夫,那情 ...

  4. js实现获取短信验证码倒计时

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  5. ubuntu 常用软件安装

    安装ubuntu远程图形界面 sudo apt-get install xrdp (sudo apt-get install ..  用于安装软件的命令 ) sudo apt-get install ...

  6. 一个比较实用的商业级图表Echarts

      了解了解                    ECharts,缩写来自Enterprise Charts,商业级数据图表,一个纯Javascript的图表库,可以流畅的运行在PC和移动设备上,兼 ...

  7. Linux学习(十二)mkpasswd、su、sudo、限制root远程登录

    一.mkpasswd mkpasswd用来生成随机密码字符串.可以指定长度和特殊字符的长度: [root@ruanwenwu01 ~]# mkpasswd O7.alw5Wq [root@ruanwe ...

  8. VS2008中C#开发webservice简单实例

    1.创建工程 文件-> 新建->网站 如下图. 工程建好后,会自动添加如下代码: using System; using System.Linq; using System.Web; us ...

  9. Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException):

    用windows连接hadoop集群执行mapreduce任务的时候出现以下错误: org.apache.hadoop.security.AccessControlException:Permissi ...

  10. HTML5网页音乐播放器

    1功能介绍 HTML5中推出了音视频标签,可以让我们不借助其他插件就可以直接播放音视频.下面我们就利用H5的audio标签及其相关属性和方法来制作一个简单的音乐播放器.主要包括以下几个功能: 1.播放 ...