1. 程式人生 > >java中的排序--排序容器_TreeSet與TreeMap

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

去重 new font static 方式 pan 重復 ima ring

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