Java集合類之TreeSet的用法詳解
上節回顧
LinkedHashSet集合概述及特點
LinkedHashSet集合特點
- 哈希表和鏈表實現Set接口,具有可預測的迭代次序
- 由鏈表保證元素有序,也就是說元素的存儲和取出順序是一致的
- 由哈希表保證元素唯一,也就是說沒有重復元素
LinkedHashSet集合的儲存和遍歷:
import java.util.LinkedHashSet; /** * LinkedListSet 集合特點 * 1.哈希表和鏈表實現Set接口,具有可預測的迭代次序 * 2.由鏈表保證元素有序,也就是說元素的存儲和取出順序是一致的 * 3.由哈希表保證元素唯一,也就是說沒有重復元素 */ public class LinkedHashSetDemo { public static void main(String[] args) { //創建集合對象 LinkedHashSet<String> linkHashSet = new LinkedHashSet<String>(); //添加元素 linkHashSet.add("hello"); linkHashSet.add("world"); linkHashSet.add("java"); linkHashSet.add("hello"); //遍歷集合(增強for) for(String s:linkHashSet){ System.out.println(s); } } }
TreeSet集合概述和特點
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 實現。使用元素的自然順序對元素進行排序,或者根據創建 set 時提供的 Comparator 進行排序,具體取決於使用的構造方法。
構造方法
構造方法 | 描述 |
---|---|
TreeSet() | 構造一個新的空 set,該 set 根據其元素的自然順序進行排序 |
TreeSet(Collection<? extends E> c) | 構造一個包含指定 collection 元素的新 TreeSet,它按照其元素的自然順序進行排序 |
TreeSet(Comparator<? super E> comparator) | 構造一個新的空 TreeSet,它根據指定比較器進行排序 |
TreeSet(SortedSet s) | 構造一個與指定有序 set 具有相同映射關系和相同排序的新 TreeSet |
方法摘要
方法 | 說明 |
---|---|
boolean add(E e) | 將指定的元素添加到此 set(如果該元素尚未存在於 set 中) |
void clear() | 移除此 set 中的所有元素 |
Iterator iterator() | 返回在此 set 中的元素上按升序進行迭代的迭代器 |
boolean remove(Object o) | 將指定的元素從 set 中移除(如果該元素存在於此 set 中) |
總結
TreeSet集合特點
元素有序,這裡的順序不是指存儲和取出的順序,而是按照一定的規則進行排序,具體排序方法取決於構造方法
- TreeSet() |構造一個新的空 set,該 set 根據其元素的自然順序進行排序。
- TreeSet(Comparator<? super E> comparator) |構造一個新的空 TreeSet,它根據指定比較器進行排序。
沒有帶索引的方法,所以不能使用普通for循環遍歷
由於是Set集合,所以不包含重復元素的集合
Demo
package com.ithmm_03; import java.util.TreeSet; /** * TreeSet集合特點 * * 元素有序,這裡的順序不是指存儲和取出的順序,而是按照一定的規則進行排序,具體排序方法取決於構造方法 * TreeSet() |構造一個新的空 set,該 set 根據其元素的自然順序進行排序。 * TreeSet(Comparator<? super E> comparator) |構造一個新的空 TreeSet,它根據指定比較器進行排序。 * 沒有帶索引的方法,所以不能使用普通for循環遍歷 * 由於是Set集合,所以不包含重復元素的集合 */ public class TreeSetDemo01 { public static void main(String[] args) { //創建集合對象 TreeSet<Integer> ts = new TreeSet<Integer>(); //添加元素 ts.add(10); ts.add(40); ts.add(90); ts.add(30); ts.add(18); ts.add(30); //遍歷集合(增強For) for(Integer s:ts){ System.out.println(s); } } }
控制臺輸出:
10 18 30 40 90
自然排序Comparable的使用
接口 Comparable< T>
類型參數:
T – 可以與此對象進行比較的那些對象的類型
此接口強行對實現它的每個類的對象進行整體排序。這種排序被稱為類的自然排序,類的 compareTo 方法被稱為它的自然比較方法。
實現此接口的對象列表(和數組)可以通過 Collections.sort(和 Arrays.sort)進行自動排序。實現此接口的對象可以用作有序映射中的鍵或有序集合中的元素,無需指定比較器。
總結:
- 用TreeSet集合存儲自定義對象,無參構造方法使用的是自然排序對元素進行排序的
- 自認排序,就是讓元素所屬的類實現Compareable接口,重寫compareTo(To)方法
- 重寫方法時,一定註意排序規則必須按照要求的主要條件和次要調價來寫
Demo:
儲存學生對象並遍歷,創建TreeSet集合使用無參構造
要求:按照年齡從小到大排序,年齡相同時,按照姓名的字幕順序排序
學生類:
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;//認為是重復元素,不添加 // return 1;//升序存儲 // return -1;//降序存儲 //按照年齡從從小到大排序 int num = this.age - s.age; //按照年齡從大到小排序 //int num = s.age - this.age; //年齡相同時,按照姓名首字母順序排序 int num2 = num==0?this.name.compareTo(s.name):num; return num2; } }
測試類:
import java.util.TreeSet; public class TreeSetDemo02 { public static void main(String[] args) { //創建集合對象 TreeSet <Student> ts = new TreeSet<Student>(); //創建學生對象 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); //把學生添加到集合 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()); } } }
控制臺輸出:
liubing 18
zhaoxiao 18
wangyi 24
xiaozhan 29
hanyan 30
比較器排序Comparator的使用
Demo:
存儲學生對象並遍歷,創建TreeSet集合使用帶參構造方法
要求:按照年齡從小到大排序,年齡相同時,按照姓名的字幕順序排序
學生類:
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; } }
測試類:
import java.util.TreeSet; public class TreeSetDemo02 { public static void main(String[] args) { //創建集合對象 TreeSet <Student> ts = new TreeSet<Student>(); //創建學生對象 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); //把學生添加到集合 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()); } } }
總結:
用TreeSet集合存儲自定義對象,代參構造方法使用的是比較器排序對元素進行排序的
比較器排序,就是讓集合構造方法接收Comparator的實現類對象,重寫compare(To1,To2)方法
重寫方法時,一定要註意排序規則必須按照要求的主要條件和次要條件
到此這篇關於Java集合類之TreeSet的用法詳解的文章就介紹到這瞭,更多相關Java TreeSet內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java 深入淺出掌握Collection單列集合Set
- Java實現List去重的方法詳解
- Java元素排序Comparable與Comparator的區別
- 一文掌握Java中List和Set接口的基本使用
- Java stream sorted使用 Comparator 進行多字段排序的方法