在之前的文章中,我总结了应用类型的排序方法,我们可以根据自己的需求对引用类型进行灵活的排序。其实JDK已经给我们提供了可以进行排序的容器—— TreeSet和TreeMap 。
这两个实现类可以对添加到里面的元素进行排序,而且这种排序是实时的,即我们每添加一个元素,这两个实现类就会把该元素按照顺序放在对应的位置上。
与之前介绍的引用类型的排序一样,想要使用这两个实现类进行排序,我们也要提供一个“比较器”。一般情况下有两种实现方式:即提供Comparable接口的compareTo() 方法或提供Comparator 接口中的 compare() 方法。这里只是简单提一下,文章正文中会有详细的讲解。
一、排序容器 TreeSet
TreeSet容器里面的元素有两种情况,即元素本身继承Comparable接口,重写了compareTo()方法;再一个就是没有重写该方法。下面我们分别给出这两种情况的实例:
1. 容器中的元素继承Comparable接口,重写了compareTo()方法
首先我们先定义一个继承Comparable接口,重写了compareTo()方法的类:
public class Worker implements Comparable<Worker> {
@Override
public int compareTo(Worker o) {
return this.salary > o.getSalary() ? 1 : (this.salary == o.getSalary() ? 0 : -1);
}
private String type; // 工种
private int salary; // 工资
public Worker() {
}
public Worker(String type, int salary) {
this.type = type;
this.salary = salary;
}
public int getSalary() {
return salary;
}
@Override
public String toString() {
return "工种:" + this.type + " 工资:" + this.salary;
}
}
如果容器中存放的是这样的元素,那么我们在定义容器的时候,会非常的方便,直接进行实例化即可,实例如下:
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetDemo02 {
public static void main(String[] args) {
TreeSet<Worker> workerTreeSet = new TreeSet<Worker>(); // 直接记性实例化即可
Worker w1 = new Worker("教师", 5000);
Worker w2 = new Worker("程序员", 5500);
Worker w3 = new Worker("快递员", 8000);
Worker w4 = new Worker("服务员", 3000);
workerTreeSet.add(w1);
workerTreeSet.add(w2);
workerTreeSet.add(w3);
workerTreeSet.add(w4);
Iterator<Worker> workerIterator = workerTreeSet.iterator();
while (workerIterator.hasNext()) {
System.out.println(workerIterator.next());
}
}
}
2. 容器中的元素没有继承Comparable接口
如果容器中存放的元素本身没有继承Comparable接口,没有重写了compareTo()方法,这个时候我们就要在实例化TreeSet容器的时候,传入一个额外的对象。首先我们先定义一个这样的元素类:
/**
* 定义一个Person类,包含姓名和人气指数
*/
public class Person {
private String name;
private int sentiment;
public Person() {
}
public Person(String name, int sentiment) {
this.name = name;
this.sentiment = sentiment;
}
public String getName() {
return name;
}
public int getSentiment() {
return sentiment;
}
@Override
public String toString() {
return "姓名:" + this.name + " 人气指数" + this.sentiment;
}
}
观察上面的类,就是一个普通的类,如果容器中存放这样的类,那么我们在定义容器对象的时候,就要传入Comparator的实例化对象,并且要重写其中的compare()方法,来指明排序规则。实例如下:
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
// 元素本身不可以排序,在实例化TreeSet对象的时候
// 需要传入一个Comparator对象
// 通过重写compare()方法来设置排序规则
TreeSet<Person> personTreeSet = new TreeSet<Person>(
new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getSentiment() - o2.getSentiment();
}
}
);
Person p1 = new Person("小赵", 20);
Person p2 = new Person("小钱", 50);
Person p3 = new Person("小孙", 10);
Person p4 = new Person("小李", 30);
personTreeSet.add(p1);
personTreeSet.add(p2);
personTreeSet.add(p3);
personTreeSet.add(p4);
Iterator<Person> personIterator = personTreeSet.iterator();
while (personIterator.hasNext()) {
System.out.println(personIterator.next());
}
}
}
一、排序容器 TreeMap
容器TreeMap与之前的容器TreeSet非常相似,只不过TreeMap里面存放的是键值对,TreeSet中存放的是单个的数值。在使用的时候,我们可以将TreeMap中的键当做TreeSet里面的数值,对应规则是一样的,下面给出两个实例:
这里的元素类是 Person 和 Worker ,与上面的类定义一模一样,大家需要看类定义的可以查看上面的代码块。
1. 容器中的键继承Comparable接口,重写了compareTo()方法
import java.util.Set;
import java.util.TreeMap;
public class TreeMapDemo02 {
public static void main(String[] args) {
TreeMap<Worker, String> workerTreeMap = new TreeMap<Worker, String>();
Worker w1 = new Worker("教师", 5000);
Worker w2 = new Worker("程序员", 5500);
Worker w3 = new Worker("快递员", 8000);
Worker w4 = new Worker("服务员", 3000);
workerTreeMap.put(w1, "001");
workerTreeMap.put(w2, "002");
workerTreeMap.put(w3, "003");
workerTreeMap.put(w4, "004");
Set<Worker> personKeySet = workerTreeMap.keySet();
for (Worker itemKey : personKeySet) {
System.out.println(itemKey);
}
}
}
2. 容器中元素的键没有继承Comparable接口
import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapDemo {
public static void main(String[] args) {
// 元素本身不可以排序,在实例化TreeSet对象的时候
// 需要传入一个Comparator对象
// 通过重写compare()方法来设置排序规则
TreeMap<Person, String> personTreeMap = new TreeMap<Person, String>(
new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getSentiment() - o2.getSentiment();
}
}
);
Person p1 = new Person("小赵", 20);
Person p2 = new Person("小钱", 50);
Person p3 = new Person("小孙", 10);
Person p4 = new Person("小李", 30);
personTreeMap.put(p1, "001");
personTreeMap.put(p2, "002");
personTreeMap.put(p3, "003");
personTreeMap.put(p4, "004");
Set<Person> personKeySet = personTreeMap.keySet();
for (Person itemKey : personKeySet) {
System.out.println(itemKey);
}
}
}
网友评论