Java TreeSet類的簡(jiǎn)單理解和使用
這篇文章主要介紹了Java TreeSet類的簡(jiǎn)單理解和使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
TreeSet類是Set接口的一個(gè)實(shí)現(xiàn)類,主要作用是用于對(duì)對(duì)象的排序以及確定存入對(duì)象的唯一性。給對(duì)象排序的方式有很多,比如一些基本類型int、String等類型就已經(jīng)提供了很多排序的方法了,但是這并不說(shuō)明TreeSet類就沒(méi)有什么用了。在一些時(shí)候我們需要自定義一些類,同時(shí)需要對(duì)這個(gè)類的對(duì)象進(jìn)行排序,那么這個(gè)時(shí)候我們就可以通過(guò)這個(gè)TreeSet類去自定義一個(gè)排序的條件。
現(xiàn)在通過(guò)一個(gè)簡(jiǎn)單的案例實(shí)現(xiàn)來(lái)實(shí)現(xiàn)這個(gè)排序和唯一性
首先自定義一個(gè)Student類,類里面有三個(gè)屬性,分別是姓名、學(xué)號(hào)、年齡
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;
}
}
然后我們給這個(gè)類的三個(gè)屬性添加值,并且將類的實(shí)例化對(duì)象添加到TreeSet類中。
注意:TreeSet類是沒(méi)有g(shù)et方法的,要輸出里面的內(nèi)容得通過(guò)foreach循環(huán)或者迭代器輸出,如果直接通過(guò)print進(jìn)行輸出,顯示的是內(nèi)存地址對(duì)象。
然后我們來(lái)看下輸出結(jié)果
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);
// 通過(guò)迭代器輸出結(jié)果
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
Student o = (Student) iterator.next();
System.out.println(o.getName());
}
}
}

可以看到無(wú)法正常輸出,報(bào)錯(cuò)。這里報(bào)錯(cuò)的原因是類型轉(zhuǎn)換錯(cuò)誤。因?yàn)閷?duì)象存入TreeSet類中時(shí)需要對(duì)對(duì)象進(jìn)行一個(gè)比較,第一次存入時(shí)因?yàn)闆](méi)有可對(duì)比的對(duì)象,所以不會(huì)報(bào)錯(cuò),但是當(dāng)?shù)诙€(gè)對(duì)象存入時(shí)需要同第一個(gè)對(duì)象進(jìn)行比較,再?zèng)Q定在二叉樹(shù)中存放的位置。這里的比較方法需要我們自己去實(shí)現(xiàn)Comparable<>接口重寫一個(gè)compareTo()方法。
那么現(xiàn)在在自定義Student類中實(shí)現(xiàn)Comparable并且重現(xiàn)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) {
//通過(guò)年齡的比較確定存放順序
return this.age-o.age;
}
}
現(xiàn)在看下輸出結(jié)果

可以看到存入的內(nèi)容可以正常輸出的了,但是老黑沒(méi)有輸出,這是因?yàn)槔虾诤屠贤醯哪挲g相同,而我們重寫的compareTo()方法中的比較條件就是年齡。下面來(lái)看看這個(gè)方法中的返回值的含義。
@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的底層結(jié)構(gòu)是一個(gè)二叉樹(shù),每次插入的對(duì)象都會(huì)根據(jù)二叉樹(shù)的結(jié)構(gòu)進(jìn)行排列。當(dāng)前后兩個(gè)對(duì)象的條件進(jìn)行比較返回正數(shù)時(shí),后一個(gè)對(duì)象會(huì)存在已前一個(gè)對(duì)象為根的右節(jié)點(diǎn);當(dāng)前后兩個(gè)對(duì)象的條件進(jìn)行比較返回負(fù)數(shù)時(shí),后一個(gè)對(duì)象會(huì)存在已前一個(gè)對(duì)象為根的左節(jié)點(diǎn);當(dāng)前后兩個(gè)對(duì)象的條件進(jìn)行比較返回0時(shí),后一個(gè)對(duì)象不存入TreeSet中。因?yàn)槔虾诤屠贤跄挲g相同,所以這里名字為老黑的對(duì)象就不存入了。
存入TreeSet中的對(duì)象輸出的順序是按照二叉樹(shù)的中序進(jìn)行輸出的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java集合TreeSet用法詳解
- Java TreeSet 添加失敗的解決
- java中treemap和treeset實(shí)現(xiàn)紅黑樹(shù)
- Java TreeSet實(shí)現(xiàn)學(xué)生按年齡大小和姓名排序的方法示例
- 詳解Java中HashSet和TreeSet的區(qū)別
- TreeSet詳解和使用示例_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- java 中HashMap、HashSet、TreeMap、TreeSet判斷元素相同的幾種方法比較
- 淺談java中的TreeMap 排序與TreeSet 排序
- Java基礎(chǔ)必學(xué)TreeSet集合
相關(guān)文章
Maven分模塊開(kāi)發(fā)與依賴管理和聚合和繼承及屬性深入詳細(xì)介紹
依賴管理是項(xiàng)目管理中非常重要的一環(huán)。幾乎任何項(xiàng)目開(kāi)發(fā)的時(shí)候需要都需要使用到庫(kù)。而這些庫(kù)很可能又依賴別的庫(kù),這樣整個(gè)項(xiàng)目的依賴形成了一個(gè)樹(shù)狀結(jié)構(gòu),而隨著這個(gè)依賴的樹(shù)的延伸和擴(kuò)大,一系列問(wèn)題就會(huì)隨之產(chǎn)生2022-10-10
Java Redis Template批量查詢指定鍵值對(duì)的實(shí)現(xiàn)
本文主要介紹了Java Redis Template批量查詢指定鍵值對(duì)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Java 在volatile內(nèi)部調(diào)用接口的方法
在Java中,volatile?關(guān)鍵字通常用于確保變量的可見(jiàn)性和有序性,而不是用來(lái)修飾接口或方法調(diào)用的,這篇文章主要介紹了Java 在volatile內(nèi)部調(diào)用接口的方法,需要的朋友可以參考下2024-07-07
java Swing基礎(chǔ)教程之圖形化實(shí)例代碼
這篇文章主要介紹了java Swing基礎(chǔ)教程之圖形化實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02
mybatis框架之mybatis中dao層開(kāi)發(fā)的兩種方法
這篇文章主要介紹了mybatis框架之mybatis中dao層開(kāi)發(fā)的兩種方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Java實(shí)現(xiàn)簡(jiǎn)單日歷小程序 Java圖形界面小日歷開(kāi)發(fā)
這篇文章主要介紹了Java實(shí)現(xiàn)簡(jiǎn)單日歷小程序,如何用Java swing開(kāi)發(fā)一款簡(jiǎn)單的小日歷,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
java 用泛型參數(shù)類型構(gòu)造數(shù)組詳解及實(shí)例
這篇文章主要介紹了java 用泛型參數(shù)類型構(gòu)造數(shù)組詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02

