Java容器的排序_Java笔记——JDK提供的排序容器

在之前的文章中,我总结了应用类型的排序方法,我们可以根据自己的需求对引用类型进行灵活的排序。其实JDK已经给我们提供了可以进行排序的容器—— TreeSet和TreeMap 。

这两个实现类可以对添加到里面的元素进行排序,而且这种排序是实时的,即我们每添加一个元素,这两个实现类就会把该元素按照顺序放在对应的位置上。

与之前介绍的引用类型的排序一样,想要使用这两个实现类进行排序,我们也要提供一个“比较器”。一般情况下有两种实现方式:即提供Comparable接口的compareTo() 方法或提供Comparator 接口中的 compare() 方法。这里只是简单提一下,文章正文中会有详细的讲解。

一、排序容器 TreeSet

TreeSet容器里面的元素有两种情况,即元素本身继承Comparable接口,重写了compareTo()方法;再一个就是没有重写该方法。下面我们分别给出这两种情况的实例:

1. 容器中的元素继承Comparable接口,重写了compareTo()方法

首先我们先定义一个继承Comparable接口,重写了compareTo()方法的类:

public class Worker implements Comparable {

@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 workerTreeSet = new TreeSet(); // 直接记性实例化即可

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 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 personTreeSet = new TreeSet(

new Comparator() {

@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 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 workerTreeMap = new TreeMap();

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 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 personTreeMap = new TreeMap(

new Comparator() {

@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 personKeySet = personTreeMap.keySet();

for (Person itemKey : personKeySet) {

System.out.println(itemKey);

}

}

}

你可能感兴趣的:(Java容器的排序)