java中的排序--排序容器_TreeSet与TreeMap

Posted 与你在巅峰相会

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的排序--排序容器_TreeSet与TreeMap相关的知识,希望对你有一定的参考价值。

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

对比

(1)Set接口:HashSet,元素必须重写hashcode和equals方法。

(2)TreeSet:只要可以排序即可。去重:比较等于0即重复。

TreeSet数据排序两种方式:

注意:TreeSet是在添加数据时进行排序,数据更改不会影响原来的顺序,因此不能修改类中数据,否则可能重复。需要在设计类时使用final修饰字段属性,同时不提供相应set、get方法。

1)、若选用无参的new TreeSet()构造器,需要元素本身可以排序方能使用,也即实体类实现java.lang.Comparable接口重写compareTo接口。

 (1)新建一个实现java.lang.Comparable接口并重写comparaTo方法的实体类

package top.wfaceboss.caseSort02;

public class Worker implements java.lang.Comparable<Worker> {
    private String type;
    private double salary;

    public Worker() {
    }

    public Worker(String type, double salary) {
        super();
        this.type = type;
        this.salary = salary;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    /**
     * 按工资升序
     */
    @Override
    public int compareTo(Worker o) {
        return this.salary > o.salary ? 1 : (this.salary == o.salary ? 0 : -1);
    }

    /**
     * 重写toString
     */
    @Override
    public String toString() {
        return "工种:" + this.type + ",工资:" + this.salary + "\\n";
    }

}

(2)使用无参的new TreeSet()构造器

package top.wfaceboss.caseSort02;

import java.util.TreeSet;

public class TreeSetDemo {
    public static void main(String[] args) {
        Worker w1 = new Worker("垃圾回收员", 5000);
        Worker w2 = new Worker("农工", 2000);
        Worker w3 = new Worker("程序员", 10000);

        TreeSet<Worker> employee = new TreeSet<Worker>();
        employee.add(w1);
        employee.add(w2);
        employee.add(w3);
        System.out.println(employee);
    }
}

结果为:

 

2)、若选用带参的new TreeSet(Comparator<? super E> comparator)构造器,需要提供额外的排序业务类(匿名内部类的方式)实现java.util.Comparator接口,重写compare方法。

   (1)新建一个没有实现java.lang.Comparable接口的实体类

package top.wfaceboss.caseSort;

public class Person {
    private final String name;
    private final int hangsome;

    public Person() {
        name = null;
        hangsome = 0;
    }

    public Person(String name, int hangsome) {
        super();
        this.name = name;
        this.hangsome = hangsome;
    }

    public String getName() {
        return name;
    }

    public int getHangsome() {
        return hangsome;
    }

    /**
     * 重写toString方法
     */
    @Override
    public String toString() {
        return "姓名:" + this.name + ",帅气指数:" + this.hangsome + "\\n";

    }
}

(2)使用带参的new TreeSet(Comparator<? super E> comparator)构造器--提供额外的业务排序类(匿名内部类的方式)

package top.wfaceboss.caseSort;

import java.util.TreeSet;

public class TreeSetDemo01 {
    public static void main(String[] args) {
        Person p1 = new Person("小红", 100);
        Person p2 = new Person("大白", 1000);
        Person p3 = new Person("小明", 10000);
        Person p4 = new Person("小黑", 100000);

        // 依次存放到TreeSet容器中
        // 由于Person类没有实现java.lang.Comparable重写compareTo接口 ,因此需要提供额外的业务排序类,否则会出错

        TreeSet<Person> persons = new TreeSet<Person>(new java.util.Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getHangsome() - o2.getHangsome();
            }
        });

        persons.add(p1);
        persons.add(p2);
        persons.add(p3);
        persons.add(p4);

        System.out.println(persons);
    }
}

 结果为:

 2.TreeMapt:键可以排序且不可重复。

其键的排序方式与上述相同。

 

以上是关于java中的排序--排序容器_TreeSet与TreeMap的主要内容,如果未能解决你的问题,请参考以下文章

TreeSet容器实现元素自排序

TreeSet典型例子两个 比较器?

TreeSet ------自然排序与定制排序(比较器)

180217_JAVA学习_TreeSet中存放含多个String的类并设置排序规则

Java中的TreeSet

Java自用集合练习题:TreeSet的自然排序与定制排序