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】
 
 
 
 

java提高(7)---TreeSet--排序的更多相关文章

  1. Java提高篇(二八)------TreeSet

    与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.在<Java提高篇(二七)-----TreeMap>中LZ详细讲解了TreeMap实现机制,如果 ...

  2. Java提高十七:TreeSet 深入分析

    前一篇我们分析了TreeMap,接下来我们分析TreeSet,比较有意思的地方是,似乎有Map和Set的地方,Set几乎都成了Map的一个马甲.此话怎讲呢?在前面一篇讨论HashMap和HashSet ...

  3. java提高篇(三十)-----Iterator

    迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...

  4. Java提高篇(二七)-----TreeMap

    TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...

  5. java提高篇(二四)-----HashSet

          在前篇博文中(java提高篇(二三)-----HashMap)详细讲解了HashMap的实现过程,对于HashSet而言,它是基于HashMap来实现的,底层采用HashMap来保存元素. ...

  6. Java提高篇---TreeMap

    TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...

  7. java提高篇---Iterator

    迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...

  8. Java深入了解TreeSet

    Java中的TreeSet是Set的一个子类,TreeSet集合是用来对象元素进行排序的,同样他也可以保证元素的唯一.那TreeSet为什么能保证元素唯一,它是怎样排序的呢?先看一段代码: publi ...

  9. TreeSet排序,存储自己定义对象,自己定义比較器演示样例

    Set:无序.不能够反复元素. |--HashSet:数据结构是哈希表.线程是非同步的. 保证元素唯一性的原理:推断元素的hashCode值是否同样. 假设同样,还会继续推断元素的equals方法.是 ...

  10. Java HashSet和TreeSet【笔记】

    Java HashSet和TreeSet[笔记] PS:HashSet.TreeSet 两个类是在 Map 的基础上组装起来的类 HashSet 类注释 1.底层实现基于 HashMap,所以迭代时不 ...

随机推荐

  1. 《修炼之道:.NET开发要点精讲》读书笔记(一)

    CLR 公共语言运行库 没有CLR的存在,就不能讲该中间件转换成对应操作系统中的机器指令. 程序集是非完全编译的产物,它兼备了源代码和本地代码的特性,是一种介于源代码和本地代码之间的独立存在的一种数据 ...

  2. 如何高效的学习 TensorFlow 代码?

    https://www.zhihu.com/question/41667903 Linux[公共基础]:TensorFlow的主要运行平台之一就是Linux,但是正式版对Windows的支持日趋完善, ...

  3. Programming for Everyone !

    Hello Internet ! This blog is to store my algorithm practices. Since Evernote code blocks do not sho ...

  4. vue history模式 apache配置

    我的服务器apache 版本是2.4.6 看文档上面说加那些代码,但是加上去重启服务器就不能重启,显示代码错误,然后百度查开启mod_rewrite这个重写URL 弄了半天也不会,百度上面的不知道是不 ...

  5. Web3D

    https://baike.baidu.com/item/WEB%203D/11066359?fr=aladdin https://zhidao.baidu.com/question/17325151 ...

  6. Python从入门到精通之Sixth!

    补充:enumerate 函数用于遍历序列(元组tuple.列表list.字典dict)中的元素以及它们的下标: >>> for i,j in enumerate(('a','b', ...

  7. Linux下mysql定时自动备份并FTP到远程脚本

    1.添加backupmysqleveryday.sh(vi /data/shell/backupmysqleveryday.sh) #!/bin/sh #this shell is user for ...

  8. ajax动态刷新的元素,导致绑定事件失效

    jquery事件绑定有2种方式: 1,普通事件绑定: $('元素').click(function(){}); 2, 事件代理或者叫事件委托 $('#chatPanelList').on('click ...

  9. java跨域问题

    public class SimpleCORSFilter implements Filter{ @Override public void destroy() { } @Override publi ...

  10. Windows平台最方便最易用的法语输入法

    原文:http://wenwen.sogou.com/z/q1700007921.htm 对于XP,在“控制面板”中选择“输入法区域设置”,单击“更改”,出现一个“设置”框:选择“添加”,然后选择“法 ...