Java TreeSet類的簡單理解和使用
這篇文章主要介紹了Java TreeSet類的簡單理解和使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
TreeSet類是Set接口的一個實(shí)現(xiàn)類,主要作用是用于對對象的排序以及確定存入對象的唯一性。給對象排序的方式有很多,比如一些基本類型int、String等類型就已經(jīng)提供了很多排序的方法了,但是這并不說明TreeSet類就沒有什么用了。在一些時候我們需要自定義一些類,同時需要對這個類的對象進(jìn)行排序,那么這個時候我們就可以通過這個TreeSet類去自定義一個排序的條件。
現(xiàn)在通過一個簡單的案例實(shí)現(xiàn)來實(shí)現(xiàn)這個排序和唯一性
首先自定義一個Student類,類里面有三個屬性,分別是姓名、學(xué)號、年齡
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; } }
然后我們給這個類的三個屬性添加值,并且將類的實(shí)例化對象添加到TreeSet類中。
注意:TreeSet類是沒有g(shù)et方法的,要輸出里面的內(nèi)容得通過foreach循環(huán)或者迭代器輸出,如果直接通過print進(jìn)行輸出,顯示的是內(nè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); // 通過迭代器輸出結(jié)果 Iterator iterator = set.iterator(); while (iterator.hasNext()) { Student o = (Student) iterator.next(); System.out.println(o.getName()); } } }
可以看到無法正常輸出,報錯。這里報錯的原因是類型轉(zhuǎn)換錯誤。因?yàn)閷ο蟠嫒隩reeSet類中時需要對對象進(jìn)行一個比較,第一次存入時因?yàn)闆]有可對比的對象,所以不會報錯,但是當(dāng)?shù)诙€對象存入時需要同第一個對象進(jìn)行比較,再決定在二叉樹中存放的位置。這里的比較方法需要我們自己去實(shí)現(xiàn)Comparable<>接口重寫一個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) { //通過年齡的比較確定存放順序 return this.age-o.age; } }
現(xiàn)在看下輸出結(jié)果
可以看到存入的內(nèi)容可以正常輸出的了,但是老黑沒有輸出,這是因?yàn)槔虾诤屠贤醯哪挲g相同,而我們重寫的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的底層結(jié)構(gòu)是一個二叉樹,每次插入的對象都會根據(jù)二叉樹的結(jié)構(gòu)進(jìn)行排列。當(dāng)前后兩個對象的條件進(jìn)行比較返回正數(shù)時,后一個對象會存在已前一個對象為根的右節(jié)點(diǎn);當(dāng)前后兩個對象的條件進(jìn)行比較返回負(fù)數(shù)時,后一個對象會存在已前一個對象為根的左節(jié)點(diǎn);當(dāng)前后兩個對象的條件進(jìn)行比較返回0時,后一個對象不存入TreeSet中。因?yàn)槔虾诤屠贤跄挲g相同,所以這里名字為老黑的對象就不存入了。
存入TreeSet中的對象輸出的順序是按照二叉樹的中序進(jìn)行輸出的。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Request的包裝類HttpServletRequestWrapper的使用說明
這篇文章主要介紹了Request的包裝類HttpServletRequestWrapper的使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Java代碼為例講解堆的性質(zhì)和基本操作以及排序方法
堆數(shù)據(jù)結(jié)構(gòu)可以看作一顆完全二叉樹,因而又被成為二叉堆,這里我們以Java代碼為例講解堆的性質(zhì)和基本操作以及排序方法,需要的朋友可以參考下2016-06-06多jdk環(huán)境下指定springboot外部配置文件詳解
這篇文章主要為大家介紹了多jdk環(huán)境下指定springboot外部配置文件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03java數(shù)據(jù)結(jié)構(gòu)之java實(shí)現(xiàn)棧
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)棧,需要的朋友可以參考下2014-03-03詳解Java中Checked Exception與Runtime Exception 的區(qū)別
這篇文章主要介紹了詳解Java中Checked Exception與Runtime Exception 的區(qū)別的相關(guān)資料,這里提供實(shí)例幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下2017-08-08Java貪心算法之Prime算法原理與實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Java貪心算法之Prime算法原理與實(shí)現(xiàn)方法,簡單描述了Prime算法的概念、原理、實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下2017-09-09淺談@FeignClient中name和value屬性的區(qū)別
這篇文章主要介紹了@FeignClient中name和value屬性的區(qū)別,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07關(guān)于Intellij IDEA中的Version Control問題
這篇文章主要介紹了Intellij IDEA中的Version Control問題,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-11-11