排序容器——高淇JAVA300讲笔记之TreeSet与TreeMap

  • TreeMap:确保key可以排序或者提供比较器
    • 确保key可以排序
    • 提供key比较器  

                 public TreeMap(Comparator<?super K> comparator)

  • TreeSet:
    • 确保元素实体可以排序
    • 排序比较器  

                 public TreeSet(Comparator<?super E> comparator)

1.TreeSet数据元素可以排序且不可重复

对比:Set接口:HashSet,元素必须重写hashCode和equals方法。

去重:比较等于0即重复。

1)、元素可以排序 java.lang.Comparable接口 + compareTo方法

new TreeSet()

2)、排序业务类 java.util.Comparator接口 + compare方法

new TreeSet(Comparator<? super E> comparator)

注意:在添加数据时排序,数据更改不会影响原来的顺序。所以不要修改数据,否则可能重复

下面来看例子。

TreeSet案例一:实现java.util.Comparator接口

先建一个Person类,里面包含姓名、帅气指数。

 1 package com.bjsxt.sort.col;
 2 
 3 public class Person {
 4     private final String name;//名称,这里加上final,是为了保证值不能被修改,以免在set里发生值重复的情况
 5     private final int handsome;//帅气指数
 6     
 7     //无参构造器
 8     public Person() {
 9         super();
10         name = null;
11         handsome = 0;
12     }
13 
14     //有参构造器
15     public Person(String name, int handsome) {
16         super();
17         this.name = name;
18         this.handsome = handsome;
19     }
20 
21     public String getName() {
22         return name;
23     }
24 
25     public int getHandsome() {
26         return handsome;
27     }
28 
29     @Override
30     public String toString() {
31         return "姓名:"+this.name+",帅气指数"+this.handsome+"
";
32     }
33     
34     
35 }

然后利用业务排序类进行排序。注意,对象是在存放到TreeSet容器内的过程中进行排序的,且数据更改不会影响原来的顺序。所以不要修改数据,否则可能重复。

 1 package com.bjsxt.sort.col;
 2 
 3 import java.util.TreeSet;
 4 
 5 /**
 6  * 提供了解耦的方式:业务排序类
 7  *
 8  */
 9 public class TreeSetDemo {
10 
11     public static void main(String[] args) {
12         // TODO Auto-generated method stub
13         Person p1 = new Person("您",100);
14         Person p2 = new Person("刘德华",1000);
15         Person p3 = new Person("梁朝伟",1200);
16         Person p4 = new Person("老裴",50);
17         
18         //依次存放到Tree容器中,使用排序的业务类(匿名内部类)
19         TreeSet<Person> persons = new TreeSet<Person>(
20                     new java.util.Comparator<Person>() {
21 
22                         @Override
23                         public int compare(Person o1, Person o2) {
24                             return o1.getHandsome() - o2.getHandsome();
25                         }
26                         
27                     }
28                 );
29         persons.add(p1);
30         //TreeSet 在添加数据时排序
31         persons.add(p2);
32         persons.add(p3);
33         persons.add(p4);
34         
35         System.out.println(persons);
36         /*
37         //改变数据
38         p4.setHandsome(100);
39         p4.setName("您");
40         */
41         //p4与p1内容重复
42          
43         //System.out.println(persons);
44         
45     }
46 
47 }

运行结果:按帅气值升序。

[姓名:老裴,帅气指数50
, 姓名:您,帅气指数100
, 姓名:刘德华,帅气指数1000
, 姓名:梁朝伟,帅气指数1200
]

TreeSet案例二:实现 java.lang.Comparable接口

先建一个工人类Worker,这个实体类实现了java.lang.Comparable接口,并且重写了compareTo方法,按工资升序。

 1 package com.bjsxt.sort.col;
 2 
 3 public class Worker implements java.lang.Comparable<Worker>{
 4     //工种
 5     private String type;
 6     //工资
 7     private double salary;
 8     
 9     //无参构造器
10     public Worker() {
11         super();
12     }
13     
14     //带参构造器
15     public Worker(String type, double salary) {
16         super();
17         this.type = type;
18         this.salary = salary;
19     }
20 
21     public String getType() {
22         return type;
23     }
24     public void setType(String type) {
25         this.type = type;
26     }
27     public double getSalary() {
28         return salary;
29     }
30     public void setSalary(double salary) {
31         this.salary = salary;
32     }
33 
34     /**
35      * 按工资升序
36      */
37     @Override
38     public int compareTo(Worker o) {
39         return this.salary>o.salary?1:(this.salary==o.salary?0:-1);
40     }
41     
42     @Override
43     public String toString() {
44         return "工种:" + this.type + ",工资:" + this.salary + "
";
45     }
46     
47 }

然后将对象存入TreeSet,在存入时进行排序。

 1 package com.bjsxt.sort.col;
 2 
 3 import java.util.TreeSet;
 4 
 5 /**
 6  * 实体类实现Comparable 接口的应用
 7  *
 8  */
 9 public class TreeSetDemo02 {
10     public static void main(String[] args) {
11         Worker w1 = new Worker("垃圾回收员",12000);
12         Worker w2 = new Worker("农名工",8000);
13         Worker w3 = new Worker("程序猿",5000);
14     
15         TreeSet<Worker> employees = new TreeSet<Worker>();
16         employees.add(w1);
17         employees.add(w2);
18         employees.add(w3);
19         System.out.println(employees);
20     }
21 }

运行结果:按工资升序。

[工种:程序猿,工资:5000.0
, 工种:农名工,工资:8000.0
, 工种:垃圾回收员,工资:12000.0
]

2.TreeMap:要求键可以排序,与上述TreeSet同理

TreeMap案例1:实现 java.util.Comparator接口

Person类同上,这里就不重复贴了。

下面是排序代码。

 1 package com.bjsxt.sort.col;
 2 
 3 import java.util.Set;
 4 import java.util.TreeMap;
 5 
 6 public class TreeMapDemo {
 7     public static void main(String[] args) {
 8         Person p1 = new Person("您",100);
 9         Person p2 = new Person("刘德华",1000);
10         Person p3 = new Person("梁朝伟",1200);
11         Person p4 = new Person("老裴",50);
12         
13         TreeMap<Person,String> map = new TreeMap<Person,String>(
14                     new java.util.Comparator<Person>() {
15     
16                         @Override
17                         public int compare(Person o1, Person o2) {
18                             return o1.getHandsome() - o2.getHandsome();
19                         }
20                         
21                     }
22                 );
23         map.put(p1, "bjsxt");
24         map.put(p2, "bjsxt");
25         map.put(p3, "bjsxt");
26         map.put(p4, "bjsxt");
27         
28         //查看键
29         Set<Person> persons = map.keySet();
30         System.out.println(persons);
31         
32     }
33 }

运行结果:按照帅气值升序。

[姓名:老裴,帅气指数50
, 姓名:您,帅气指数100
, 姓名:刘德华,帅气指数1000
, 姓名:梁朝伟,帅气指数1200
]

TreeMap案例2:实现了java.lang.Comparable接口

Worker类同上,这里就不重复贴了。

下面是排序代码。

 1 package com.bjsxt.sort.col;
 2 
 3 import java.util.TreeMap;
 4 
 5 public class TreeMapDemo02 {
 6     public static void main(String[] args) {
 7         Worker w1 = new Worker("垃圾回收员",12000);
 8         Worker w2 = new Worker("农名工",8000);
 9         Worker w3 = new Worker("程序猿",5000);
10     
11         TreeMap<Worker,String> employees = new TreeMap<Worker,String>();
12         employees.put(w1,"bjsxt");
13         employees.put(w2,"bjsxt");
14         employees.put(w3,"bjsxt");
15         System.out.println(employees.keySet());
16     }
17 }

运行结果:

[工种:程序猿,工资:5000.0
, 工种:农名工,工资:8000.0
, 工种:垃圾回收员,工资:12000.0
]
原文地址:https://www.cnblogs.com/swimminglover/p/8325155.html