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 }