TreeSet:能够对元素按照某种规则进行排序。
排序有两种方式
A:自然排序
B:比较器排序
TreeSet集合的特点:排序和唯一
通过观察TreeSet的add()方法,我们知道最终要看TreeMap的put()方法。
1 package zl_TreeSet; 2 3 import java.util.TreeSet; 4 public class TreeSetDemo { 5 6 public static void main(String[] args) { 7 //创建TreeSet集合 8 TreeSet<String> tree = new TreeSet<String>(); 9 10 //添加元素 自然排序 11 tree.add("bac"); 12 tree.add("cba"); 13 tree.add("a"); 14 tree.add("u"); 15 tree.add("bca"); 16 tree.add("b"); 17 tree.add("p"); 18 tree.add(""); 19 tree.add("F"); 20 21 //遍历 22 for(String s : tree){ 23 System.out.println(s); 24 // F,a,b,bac,bca,cba,p,u 字符串的话,自然排序是按照ASCII表的顺序,第一位相同,看第二位 25 } 26 System.out.println("---------"); 27 28 TreeSet<Integer> tree1 = new TreeSet<Integer>(); 29 30 tree1.add(14); 31 tree1.add(34); 32 tree1.add(41); 33 tree1.add(16); 34 tree1.add(23); 35 tree1.add(45); 36 tree1.add(41); 37 tree1.add(23); 38 39 for(Integer i : tree1){ 40 System.out.println(i); 41 //int类型直接按照数字顺序排序 42 } 43 44 } 45 46 }
用StreeSet集合存储自定义对象并遍历。
如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口
创建TreeSet集合,添加动物对象,按照以下规则进行排序:
品种名字长度短的在前面
因为只有一个主要的条件,而如果就根据这个写自然排序的话,那么长度一样的对象,只会添加进去一个
所以,要增加次要条件:
a:长度一样的,判断动物的颜色是否一样
b:前两者一样,再判断年龄是否一样
以上都是自然排序
首先看对象类:
1 package zl_TreeSet; 2 3 public class Animal implements Comparable<Animal>{ 4 5 private String name; 6 private String color; 7 private int age; 8 public Animal() { 9 super(); 10 // TODO Auto-generated constructor stub 11 } 12 public Animal(String name, String color, int age) { 13 super(); 14 this.name = name; 15 this.color = color; 16 this.age = age; 17 } 18 public String getName() { 19 return name; 20 } 21 public void setName(String name) { 22 this.name = name; 23 } 24 public String getColor() { 25 return color; 26 } 27 public void setColor(String color) { 28 this.color = color; 29 } 30 public int getAge() { 31 return age; 32 } 33 public void setAge(int age) { 34 this.age = age; 35 } 36 /* 37 A:品种名字长度短的在前面 38 39 因为只有一个主要的条件,而如果就根据这个写自然排序的话,那么长度一样的对象,只会添加进去一个 40 所以,要增加次要条件: 41 a:长度一样的,判断动物的颜色是否一样 42 b:前两者一样,再判断年龄是否一样 43 */ 44 public int compareTo(Animal a) { 45 46 //品种名字长度短的在前面 47 int num = this.name.length() - a.name.length(); 48 49 //长度相同了,要看名字的内容是否相同 50 int num2 = num == 0 ? this.name.compareTo(a.name):num; 51 52 //长度和内容都相等了,并不代表颜色相同 53 int num3 = num2 == 0 ? this.color.compareTo(a.color) : num2; 54 55 //上面都相同了,不代表年龄相同 56 int num4 = num3 == 0? this.age - a.age : num3; 57 58 //得到最终的排序结论 59 return num4 ; 60 61 } 62 63 64 }
测试类:
1 package zl_TreeSet; 2 3 public class Animal implements Comparable<Animal>{ 4 5 private String name; 6 private String color; 7 private int age; 8 public Animal() { 9 super(); 10 // TODO Auto-generated constructor stub 11 } 12 public Animal(String name, String color, int age) { 13 super(); 14 this.name = name; 15 this.color = color; 16 this.age = age; 17 } 18 public String getName() { 19 return name; 20 } 21 public void setName(String name) { 22 this.name = name; 23 } 24 public String getColor() { 25 return color; 26 } 27 public void setColor(String color) { 28 this.color = color; 29 } 30 public int getAge() { 31 return age; 32 } 33 public void setAge(int age) { 34 this.age = age; 35 } 36 /* 37 A:品种名字长度短的在前面 38 39 因为只有一个主要的条件,而如果就根据这个写自然排序的话,那么长度一样的对象,只会添加进去一个 40 所以,要增加次要条件: 41 a:长度一样的,判断动物的颜色是否一样 42 b:前两者一样,再判断年龄是否一样 43 */ 44 public int compareTo(Animal a) { 45 46 //品种名字长度短的在前面 47 int num = this.name.length() - a.name.length(); 48 49 //长度相同了,要看名字的内容是否相同 50 int num2 = num == 0 ? this.name.compareTo(a.name):num; 51 52 //长度和内容都相等了,并不代表颜色相同 53 int num3 = num2 == 0 ? this.color.compareTo(a.color) : num2; 54 55 //上面都相同了,不代表年龄相同 56 int num4 = num3 == 0? this.age - a.age : num3; 57 58 //得到最终的排序结论 59 return num4 ; 60 61 } 62 63 64 65 }