Java集合類之TreeSet的用法詳解
上節(jié)回顧
LinkedHashSet集合概述及特點(diǎn)
LinkedHashSet集合特點(diǎn)
- 哈希表和鏈表實(shí)現(xiàn)Set接口,具有可預(yù)測(cè)的迭代次序
- 由鏈表保證元素有序,也就是說(shuō)元素的存儲(chǔ)和取出順序是一致的
- 由哈希表保證元素唯一,也就是說(shuō)沒有重復(fù)元素
LinkedHashSet集合的儲(chǔ)存和遍歷:
import java.util.LinkedHashSet; /** * LinkedListSet 集合特點(diǎn) * 1.哈希表和鏈表實(shí)現(xiàn)Set接口,具有可預(yù)測(cè)的迭代次序 * 2.由鏈表保證元素有序,也就是說(shuō)元素的存儲(chǔ)和取出順序是一致的 * 3.由哈希表保證元素唯一,也就是說(shuō)沒有重復(fù)元素 */ public class LinkedHashSetDemo { public static void main(String[] args) { //創(chuàng)建集合對(duì)象 LinkedHashSet<String> linkHashSet = new LinkedHashSet<String>(); //添加元素 linkHashSet.add("hello"); linkHashSet.add("world"); linkHashSet.add("java"); linkHashSet.add("hello"); //遍歷集合(增強(qiáng)for) for(String s:linkHashSet){ System.out.println(s); } } }
TreeSet集合概述和特點(diǎn)
java.util
類 TreeSet
java.lang.Object
繼承者 java.util.AbstractCollection< E>
繼承者 java.util.AbstractSet< E>
繼承者 java.util.TreeSet< E>
public class TreeSet< E>
extends AbstractSet< E>
implements NavigableSet< E>, Cloneable, Serializable
基于 TreeMap 的 NavigableSet 實(shí)現(xiàn)。使用元素的自然順序?qū)υ剡M(jìn)行排序,或者根據(jù)創(chuàng)建 set 時(shí)提供的 Comparator 進(jìn)行排序,具體取決于使用的構(gòu)造方法。
構(gòu)造方法
構(gòu)造方法 | 描述 |
---|---|
TreeSet() | 構(gòu)造一個(gè)新的空 set,該 set 根據(jù)其元素的自然順序進(jìn)行排序 |
TreeSet(Collection<? extends E> c) | 構(gòu)造一個(gè)包含指定 collection 元素的新 TreeSet,它按照其元素的自然順序進(jìn)行排序 |
TreeSet(Comparator<? super E> comparator) | 構(gòu)造一個(gè)新的空 TreeSet,它根據(jù)指定比較器進(jìn)行排序 |
TreeSet(SortedSet s) | 構(gòu)造一個(gè)與指定有序 set 具有相同映射關(guān)系和相同排序的新 TreeSet |
方法摘要
方法 | 說(shuō)明 |
---|---|
boolean add(E e) | 將指定的元素添加到此 set(如果該元素尚未存在于 set 中) |
void clear() | 移除此 set 中的所有元素 |
Iterator iterator() | 返回在此 set 中的元素上按升序進(jìn)行迭代的迭代器 |
boolean remove(Object o) | 將指定的元素從 set 中移除(如果該元素存在于此 set 中) |
總結(jié)
TreeSet集合特點(diǎn)
元素有序,這里的順序不是指存儲(chǔ)和取出的順序,而是按照一定的規(guī)則進(jìn)行排序,具體排序方法取決于構(gòu)造方法
- TreeSet() |構(gòu)造一個(gè)新的空 set,該 set 根據(jù)其元素的自然順序進(jìn)行排序。
- TreeSet(Comparator<? super E> comparator) |構(gòu)造一個(gè)新的空 TreeSet,它根據(jù)指定比較器進(jìn)行排序。
沒有帶索引的方法,所以不能使用普通for循環(huán)遍歷
由于是Set集合,所以不包含重復(fù)元素的集合
Demo
package com.ithmm_03; import java.util.TreeSet; /** * TreeSet集合特點(diǎn) * * 元素有序,這里的順序不是指存儲(chǔ)和取出的順序,而是按照一定的規(guī)則進(jìn)行排序,具體排序方法取決于構(gòu)造方法 * TreeSet() |構(gòu)造一個(gè)新的空 set,該 set 根據(jù)其元素的自然順序進(jìn)行排序。 * TreeSet(Comparator<? super E> comparator) |構(gòu)造一個(gè)新的空 TreeSet,它根據(jù)指定比較器進(jìn)行排序。 * 沒有帶索引的方法,所以不能使用普通for循環(huán)遍歷 * 由于是Set集合,所以不包含重復(fù)元素的集合 */ public class TreeSetDemo01 { public static void main(String[] args) { //創(chuàng)建集合對(duì)象 TreeSet<Integer> ts = new TreeSet<Integer>(); //添加元素 ts.add(10); ts.add(40); ts.add(90); ts.add(30); ts.add(18); ts.add(30); //遍歷集合(增強(qiáng)For) for(Integer s:ts){ System.out.println(s); } } }
控制臺(tái)輸出:
10 18 30 40 90
自然排序Comparable的使用
接口 Comparable< T>
類型參數(shù):
T - 可以與此對(duì)象進(jìn)行比較的那些對(duì)象的類型
此接口強(qiáng)行對(duì)實(shí)現(xiàn)它的每個(gè)類的對(duì)象進(jìn)行整體排序。這種排序被稱為類的自然排序,類的 compareTo 方法被稱為它的自然比較方法。
實(shí)現(xiàn)此接口的對(duì)象列表(和數(shù)組)可以通過(guò) Collections.sort(和 Arrays.sort)進(jìn)行自動(dòng)排序。實(shí)現(xiàn)此接口的對(duì)象可以用作有序映射中的鍵或有序集合中的元素,無(wú)需指定比較器。
總結(jié):
- 用TreeSet集合存儲(chǔ)自定義對(duì)象,無(wú)參構(gòu)造方法使用的是自然排序?qū)υ剡M(jìn)行排序的
- 自認(rèn)排序,就是讓元素所屬的類實(shí)現(xiàn)Compareable接口,重寫compareTo(To)方法
- 重寫方法時(shí),一定注意排序規(guī)則必須按照要求的主要條件和次要調(diào)價(jià)來(lái)寫
Demo:
儲(chǔ)存學(xué)生對(duì)象并遍歷,創(chuàng)建TreeSet集合使用無(wú)參構(gòu)造
要求:按照年齡從小到大排序,年齡相同時(shí),按照姓名的字幕順序排序
學(xué)生類:
package com.ithmm_03; public class Student implements Comparable<Student> { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int compareTo(Student s) { // return 0;//認(rèn)為是重復(fù)元素,不添加 // return 1;//升序存儲(chǔ) // return -1;//降序存儲(chǔ) //按照年齡從從小到大排序 int num = this.age - s.age; //按照年齡從大到小排序 //int num = s.age - this.age; //年齡相同時(shí),按照姓名首字母順序排序 int num2 = num==0?this.name.compareTo(s.name):num; return num2; } }
測(cè)試類:
import java.util.TreeSet; public class TreeSetDemo02 { public static void main(String[] args) { //創(chuàng)建集合對(duì)象 TreeSet <Student> ts = new TreeSet<Student>(); //創(chuàng)建學(xué)生對(duì)象 Student s1 = new Student("xiaozhan",29); Student s2 = new Student("wangyi",24); Student s3 = new Student("hanyan",30); Student s4 = new Student("zhaoxiao",18); Student s5 = new Student("liubing",18); //把學(xué)生添加到集合 ts.add(s1); ts.add(s2); ts.add(s3); ts.add(s4); ts.add(s5); //遍歷集合 for(Student s : ts){ System.out.println(s.getName() + " " + s.getAge()); } } }
控制臺(tái)輸出:
liubing 18
zhaoxiao 18
wangyi 24
xiaozhan 29
hanyan 30
比較器排序Comparator的使用
Demo:
存儲(chǔ)學(xué)生對(duì)象并遍歷,創(chuàng)建TreeSet集合使用帶參構(gòu)造方法
要求:按照年齡從小到大排序,年齡相同時(shí),按照姓名的字幕順序排序
學(xué)生類:
public class Student { private String name; private int age; public Student() { } public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } }
測(cè)試類:
import java.util.TreeSet; public class TreeSetDemo02 { public static void main(String[] args) { //創(chuàng)建集合對(duì)象 TreeSet <Student> ts = new TreeSet<Student>(); //創(chuàng)建學(xué)生對(duì)象 Student s1 = new Student("xiaozhan",29); Student s2 = new Student("wangyi",24); Student s3 = new Student("hanyan",30); Student s4 = new Student("zhaoxiao",18); Student s5 = new Student("liubing",18); //把學(xué)生添加到集合 ts.add(s1); ts.add(s2); ts.add(s3); ts.add(s4); ts.add(s5); //遍歷集合 for(Student s : ts){ System.out.println(s.getName() + " " + s.getAge()); } } }
總結(jié):
用TreeSet集合存儲(chǔ)自定義對(duì)象,代參構(gòu)造方法使用的是比較器排序?qū)υ剡M(jìn)行排序的
比較器排序,就是讓集合構(gòu)造方法接收Comparator的實(shí)現(xiàn)類對(duì)象,重寫compare(To1,To2)方法
重寫方法時(shí),一定要注意排序規(guī)則必須按照要求的主要條件和次要條件
到此這篇關(guān)于Java集合類之TreeSet的用法詳解的文章就介紹到這了,更多相關(guān)Java TreeSet內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
項(xiàng)目打包成jar后包無(wú)法讀取src/main/resources下文件的解決
本文主要介紹了項(xiàng)目打包成jar后包無(wú)法讀取src/main/resources下文件的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04如何用Java?幾分鐘處理完?30?億個(gè)數(shù)據(jù)(項(xiàng)目難題)
現(xiàn)有一個(gè) 10G 文件的數(shù)據(jù),里面包含了 18-70 之間的整數(shù),分別表示 18-70 歲的人群數(shù)量統(tǒng)計(jì),今天小編通過(guò)本文給大家講解如何用Java?幾分鐘處理完?30?億個(gè)數(shù)據(jù),這個(gè)問(wèn)題一直以來(lái)是項(xiàng)目難題,今天通過(guò)本文給大家詳細(xì)介紹下,感興趣的朋友一起看看吧2022-07-07Java實(shí)現(xiàn)帶有權(quán)重隨機(jī)算法的示例詳解
這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)帶有權(quán)重隨機(jī)算法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10SpringMVC日期類型接收空值異常問(wèn)題解決方法
這篇文章主要介紹了SpringMVC日期類型接收空值異常問(wèn)題解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10