美文网首页
Java笔记——JDK提供的排序容器

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

作者: 振礼硕晨 | 来源:发表于2019-01-09 19:45 被阅读0次

    在之前的文章中,我总结了应用类型的排序方法,我们可以根据自己的需求对引用类型进行灵活的排序。其实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);
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Java笔记——JDK提供的排序容器

          本文链接:https://www.haomeiwen.com/subject/mytkrqtx.html