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

在之前的文章中,我总结了应用类型的排序方法,我们可以根据自己的需求对引用类型进行灵活的排序。其实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里面的数值,对应规则是一样的,下面给出两个实例:

这里的元素类是 PersonWorker ,与上面的类定义一模一样,大家需要看类定义的可以查看上面的代码块。

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);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值