Java TreeSet類的簡單理解和使用
這篇文章主要介紹了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("老黑",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,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;<br data-filtered="filtered"> return 1;<br data-filtered="filtered"> return -1;<br data-filtered="filtered"> }
compareTo()方法的返回值型別是int型別,在這裡只存在三種情況,分別是:大於0,小於0,和等於0。
TreeSet的底層結構是一個二叉樹,每次插入的物件都會根據二叉樹的結構進行排列。當前後兩個物件的條件進行比較返回正數時,後一個物件會存在已前一個物件為根的右節點;當前後兩個物件的條件進行比較返回負數時,後一個物件會存在已前一個物件為根的左節點;當前後兩個物件的條件進行比較返回0時,後一個物件不存入TreeSet中。因為老黑和老王年齡相同,所以這裡名字為老黑的物件就不存入了。
存入TreeSet中的物件輸出的順序是按照二叉樹的中序進行輸出的。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。