java中TreeSet類的簡單理解和使用


  TreeSet類是Set接口的一個實現類,主要作用是用於對對象的排序以及確定存入對象的唯一性。給對象排序的方式有很多,比如一些基本類型int、String等類型就已經提供了很多排序的方法了,但是這並不說明TreeSet類就沒有什么用了。在一些時候我們需要自定義一些類,同時需要對這個類的對象進行排序,那么這個時候我們就可以通過這個TreeSet類去自定義一個排序的條件。

 

現在通過一個簡單的案例實現來實現這個排序和唯一性

 

首先自定義一個Student類,類里面有三個屬性,分別是姓名、學號、年齡

public class Student{


    private String name;
    private String num;
    private int age;


    Student(String name, String num, int age) {
        this.name = name;
        this.num = num;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }


}

  

然后我們給這個類的三個屬性添加值,並且將類的實例化對象添加到TreeSet類中。

注意:TreeSet類是沒有get方法的,要輸出里面的內容得通過foreach循環或者迭代器輸出,如果直接通過print進行輸出,顯示的是內存地址對象。

import java.util.Iterator;
import java.util.Set;

public class TreeSet {

    public static void main(String[] args) {


        Student s1 = new Student("張珊", "111213", 18);
        Student s2 = new Student("隔壁", "111215", 19);
        Student s3 = new Student("翠花", "111214", 12);
        Student s4 = new Student("老王", "111212", 11);
        Student s5 = new Student("老黑", "111212", 11);


        Set set = new java.util.TreeSet();

        set.add(s1);
        set.add(s2);
        set.add(s3);
        set.add(s4);
        set.add(s5);

//      通過迭代器輸出結果
        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            Student o = (Student) iterator.next();
            System.out.println(o.getName());

        }


    }


}

 

 

然后我們來看下輸出結果

 

 

可以看到無法正常輸出,報錯。這里報錯的原因是類型轉換錯誤。因為將對象存入TreeSet類中時需要對對象進行一個比較,第一次存入時因為沒有可對比的對象,所以不會報錯,但是當第二個對象存入時需要同第一個對象進行比較,再決定在二叉樹中存放的位置。這里的比較方法需要我們自己去實現Comparable<>接口重寫一個compareTo()方法。

 

那么現在在自定義Student類中實現Comparable並且重現compareTo()方法

public class Student implements Comparable<Student>{


    private String name;
    private String num;
    private int age;


    Student(String name, String num, int age) {
        this.name = name;
        this.num = num;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }



    @Override
    public int compareTo(Student o) {
//通過年齡的比較確定存放順序
        return this.age-o.age;
    }
}

  

現在看下輸出結果

 

可以看到存入的內容可以正常輸出的了,但是老黑沒有輸出,這是因為老黑和老王的年齡相同,而我們重寫的compareTo()方法中的比較條件就是年齡。下面來看看這個方法中的返回值的含義。

@Override
    public int compareTo(Student o) {

        return 0;
     return 1;
     return -1;
}

  

compareTo()方法的返回值類型是int類型,在這里只存在三種情況,分別是:大於0,小於0,和等於0。

TreeSet的底層結構是一個二叉樹,每次插入的對象都會根據二叉樹的結構進行排列。當前后兩個對象的條件進行比較返回正數時,后一個對象會存在已前一個對象為根的右節點;當前后兩個對象的條件進行比較返回負數時,后一個對象會存在已前一個對象為根的左節點;當前后兩個對象的條件進行比較返回0時,后一個對象不存入TreeSet中。因為老黑和老王年齡相同,所以這里名字為老黑的對象就不存入了。

存入TreeSet中的對象輸出的順序是按照二叉樹的中序進行輸出的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM