TreeSet类

来源:互联网 发布:php o2o系统 编辑:程序博客网 时间:2024/06/14 13:57
底层使用了红黑树(二叉树)数据结构实现的,特点:会对元素进行排序存储。
使用treeSet要注意的事项:
     1.往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。
     2.往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类必须要实现Comparable接口,把元素的比较规则定义
         在compareTo(T o)方法上。
     3.如果比较元素的时候,compareTo()返回的是0, 那么该元素就被视为重复元素,不允许添加。(注意:TreeSet与HashCode、equals方法没有任何关系)
     4.往TreeSet添加元素的时候,如果元素本身没有具备自然顺序的特性,而元素所属的类也没有实现Comparable接口,那么必须要在创建TreeSet的时候传入一个比较器。
         如何定义比较器:自定义一个类实现Comparator接口即可,把元素与元素之间的比较规则定义在cpmpare方法内即可。
             自定义比较器的格式:
                 class 类名 implements Comparator{
 
                 }
     5.如果元素本身不具备自然顺序的特性,而元素所属的类已经实现了Comparable接口,在创建TreeSet对象的时候也传入了比较器,那么是
         以比较器的比较规则优先使用。
 
     推荐使用:比较器(Comparator)。。。。因为复用性  
  1. package com.cn.set;
  2. import java.util.Comparator;
  3. import java.util.TreeSet;
  4. /**
  5. * Author:Liu Zhiyong
  6. * Version:Version_1
  7. * Date:2016年7月16日16:47:23
  8. * Desc:2016年7月16日16:47:26
  9. * 使用treeSet要注意的事项:
  10. * 1.往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。
  11. * 2.往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类必须要实现Comparable接口,把元素的比较规则定义
  12. * 在compareTo(T o)方法上。
  13. * 3.如果比较元素的时候,compareTo()返回的是0, 那么该元素就被视为重复元素,不允许添加。(注意:TreeSet与HashCode、equals方法没有任何关系)
  14. * 4.往TreeSet添加元素的时候,如果元素本身没有具备自然顺序的特性,而元素所属的类也没有实现Comparable接口,那么必须要在创建TreeSet的时候传入一个比较器。
  15. * 如何定义比较器:自定义一个类实现Comparator接口即可,把元素与元素之间的比较规则定义在cpmpare方法内即可。
  16. * 自定义比较器的格式:
  17. * class 类名 implements Comparator{
  18. *
  19. * }
  20. * 5.如果元素本身不具备自然顺序的特性,而元素所属的类已经实现了Comparable接口,在创建TreeSet对象的时候也传入了比较器,那么是
  21. * 以比较器的比较规则优先使用。
  22. *
  23. * 推荐使用:比较器(Comparator)。。。。因为复用性
  24. *
  25. */
  26. //自定义一个比较器
  27. class MyComparator implements Comparator{
  28. @Override
  29. public int compare(Object o1, Object o2) {
  30. // TODO Auto-generated method stub
  31. Emp e1 = (Emp)o1;
  32. Emp e2 = (Emp)o2;
  33. return e1.id-e2.id;
  34. }
  35. }
  36. class Emp implements Comparable{
  37. int id;
  38. String name;
  39. double salary;
  40. public Emp(int id, String name, double salary) {
  41. super();
  42. this.id = id;
  43. this.name = name;
  44. this.salary = salary;
  45. }
  46. @Override
  47. public String toString() {
  48. // TODO Auto-generated method stub
  49. return "{" + this.id +" " + this.name + " " + this.salary + "}";
  50. }
  51. @Override//元素与元素之间的比较规则
  52. //负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
  53. public int compareTo(Object o) {
  54. Emp e = (Emp)o;
  55. System.out.println(this.name + "与" + e.name + "进行比较");
  56. return new Double(this.salary - e.salary).intValue();//double转换成int
  57. }
  58. }
  59. public class Demo3 {
  60. public static void main(String[] args) {
  61. //创建一个比较器对象
  62. MyComparator myComparator = new MyComparator();
  63. //创建TreeSet的时候传入比较器
  64. TreeSet treeSet = new TreeSet(myComparator);
  65. /*treeSet.add(1);
  66. treeSet.add(2);
  67. treeSet.add(4);
  68. treeSet.add(4);
  69. treeSet.add(3);
  70. treeSet.add(0);
  71. treeSet.add('c');
  72. treeSet.add('a');
  73. treeSet.add('d');*/
  74. treeSet.add(new Emp(110, "木先森", 500));
  75. treeSet.add(new Emp(120, "小龙女", 900));
  76. treeSet.add(new Emp(230, "杨过", 200));
  77. treeSet.add(new Emp(340, "习近平", 400));
  78. treeSet.add(new Emp(70, "刘先生", 190));
  79. treeSet.add(new Emp(170, "哈哈哈", 190));
  80. System.out.println(treeSet);
  81. }
  82. }
TreeSet是可以对字符串进行排序的,因为字符串已经实现了Comparable接口。     
     字符串的比较规则:
        情况1:对应位置上有不同的字符出现,比较的就是对应位置上不同的字符。 
         情况2:对应位置上的字符都一样,比较的就是字符串的长度。  
  1. package com.cn.set;
  2. import java.util.TreeSet;
  3. /**
  4. * Author:Liu Zhiyong
  5. * Version:Version_1
  6. * Date:2016年7月17日13:31:45
  7. * Desc:
  8. * TreeSet是可以对字符串进行排序的,因为字符串已经实现了Comparable接口。
  9. *
  10. * 字符串的比较规则:
  11. * 情况1:对应位置上有不同的字符出现,比较的就是对应位置上不同的字符。*
  12. * 情况2:对应位置上的字符都一样,比较的就是字符串的长度。
  13. */
  14. public class Demo4 {
  15. public static void main(String[] args) {
  16. TreeSet treeSet = new TreeSet();
  17. /*treeSet.add("abcccccccccccccccccccccc");
  18. treeSet.add("abw");
  19. treeSet.add("abc");
  20. treeSet.add("ab");
  21. System.out.println(treeSet);
  22. */
  23. System.out.println("abw".compareTo("abcccccccccccccccccc"));//左边的大
  24. }
  25. }
利用TreeSet排序的例子:
  1. package com.cn.set;
  2. import java.util.Iterator;
  3. import java.util.TreeSet;
  4. /**
  5. * Author:Liu Zhiyong
  6. * Version:Version_1
  7. * Date:2016年7月17日16:15:03
  8. * Desc:
  9. * 将字符串中的数值进行排序:
  10. * 例如:String str = "8 10 15 5 2 7"; ---> "2 5 7 8 10 15"
  11. */
  12. public class Demo5 {
  13. public static void main(String[] args) {
  14. String str = "8 10 15 5 2 7";
  15. String[] strArray = str.split(" ");
  16. TreeSet treeSet = new TreeSet();
  17. for(int i=0; i<strArray.length; i++){
  18. //treeSet.add(new Integer(strArray[i]).intValue());//字符串转int类型数据
  19. treeSet.add(new Integer(Integer.parseInt(strArray[i])));//字符串转int类型数据,才能正常排序
  20. }
  21. Iterator iterator = treeSet.iterator();
  22. //StringBuffer sb = new StringBuffer();
  23. while(iterator.hasNext()){
  24. //Integer str2 = (Integer)iterator.next();
  25. //sb.append(str2 + " ");
  26. System.out.print(iterator.next() + " ");
  27. }
  28. //String newStr = sb.toString();
  29. //System.out.println(newStr);
  30. }
  31. }
0 0