java TreeSet去重與排序入門
TreeSet用途
相比於HashSet,放入TreeSet的資料是有序的.那麼這種有序是如何實現的呢?
TreeSet有序的原因
如下,插入的順序是c d a,輸出的時候是a c d,說明排序了.那麼是如何排序的呢?
public class Test {
public static void main(String[] args) {
TreeSet<String> ts = new TreeSet<>();
ts.add("c");// 在add方法時就排序了
ts.add("d");// "d".compareTo("c")
ts.add("a");
System.out.println(ts);// [a, c, d]
}
}
需要深入探究add方法,可以看出是呼叫了Map的put方法.然後value為固定值PRESENT.這是一種設計模式,叫做介面卡設計模式. 以插入"d"為例,此時引數e的值為"d"
進入put方法
檢視是否有Comparator
在本例中沒有,所以要用Comparable 此處可以看出Comparator的優先順序高於Comparable,實際上呼叫的是該介面下的compareTo方法.
自定義類排序
自定義的類要實現排序,就要實現Comparable介面或者實現Comparator.
Comparable決定TreeSet順序
下面這個例子實現Comparable的compareTo介面,然後無論什麼,都返回0. 此時set中就只能插入一個元素了.因為再怎麼判斷都是重複資料.
public class Test {
public static void main(String[] args) {
TreeSet<Person> ts = new TreeSet<>();
ts.add(new Person(18));
ts.add(new Person(28));
ts.add(new Person(8));
ts.add(new Person(25));
ts.add(new Person(20));
// 由於Set不能重複,所以return 0只能輸出一個資料,重複的資料不予輸入。
System.out.println(ts);// [18]
}
}
class Person implements Comparable{
private int age;
public Person(int age){
this.age=age;
}
@Override
public String toString() {
return ""+age;
}
@Override
public int compareTo(Object o) {
return 0;
}
}
下面例子實現Comparable介面的compareTo方法,並依據年齡決定TreeSet中元素的順序.
public class Test {
public static void main(String[] args) {
TreeSet<Person> ts = new TreeSet<>();
ts.add(new Person(18, "lisi"));
ts.add(new Person(28, "wangwu"));
ts.add(new Person(8, "xiaobai"));
ts.add(new Person(25, "zhaosi"));
ts.add(new Person(20, "liuneng"));
System.out.println(ts);// [wangwu 28, zhaosi 25, liuneng 20, lisi 18, xiaobai 8]
}
}
class Person implements Comparable {
private int age;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return name + " " + age;
}
//依據年齡決定插入順序
@Override
public int compareTo(Object o) {
if (!(o instanceof Person)) {
throw new ClassCastException("型別不對");
}
Person p = (Person) o;
return p.age - this.age;
}
}
Comparator.決定TreeSet順序
上面例子中,如果不想用年齡來排序,想用name作為排序依據,如何做?可以在Treeset的建構函式中傳入 Comparator物件,如下
public class Test {
public static void main(String[] args) {
TreeSet<Person> ts = new TreeSet<>((o1, o2) -> o1.getName().compareTo(o2.getName()));
ts.add(new Person(18, "lisi"));
ts.add(new Person(28, "wangwu"));
ts.add(new Person(8, "xiaobai"));
ts.add(new Person(25, "zhaosi"));
ts.add(new Person(20, "liuneng"));
System.out.println(ts);//[lisi 18, liuneng 20, wangwu 28, xiaobai 8, zhaosi 25]
}
}
class Person implements Comparable {
private int age;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name + " " + age;
}
//依據年齡決定插入順序
@Override
public int compareTo(Object o) {
if (!(o instanceof Person)) {
throw new ClassCastException("型別不對");
}
Person p = (Person) o;
return p.age - this.age;
}
}
TreeSet如何去重
treeset在排序中包含了去重,因為重複的key不會被新增到map中.
總結
- Treeset可以去重,可以有序
- Treeset有序依賴於實現Comparable介面或者有比較器Comparator
相關文章
- TreeSet重寫Comparator排序排序
- 陣列的去重和排序陣列排序
- Java入門系列之重寫Java
- 【java】【集合】TreeSetJava
- java list 集合去重Java
- 陣列物件的去重然後排序陣列物件排序
- MySQL入門——排序MySql排序
- 第 10 節:複合型別 1.4 氣泡排序與陣列去重型別排序陣列
- Java集合(3)一 紅黑樹、TreeMap與TreeSet(上)Java
- Java集合(4)一 紅黑樹、TreeMap與TreeSet(下)Java
- 快速排序快速入門排序
- java陣列中重複元素的去重Java陣列
- 排序演算法入門:選擇排序排序演算法
- 橫掃Java Collections系列 —— TreeSetJava
- 更好的 java 重試框架 sisyphus 入門簡介Java框架
- LeetCode入門指南 之 排序LeetCode排序
- 排序演算法入門之「選擇排序」排序演算法
- 排序演算法入門之「插入排序」排序演算法
- 透過Treeset解決隨機數排序問題隨機排序
- 去“5”排序排序
- Java Set 常用集合 HashSet、LinkedHashSet、TreeSetJava
- Java入門程式設計師必看:給陣列進行排序Java程式設計師陣列排序
- 09_ClickHouse,ReplacingMergeTree,案例,根據排序鍵去重,使用版本引數的去重(學習筆記)排序筆記
- Java入門教程十二(集合與泛型)Java泛型
- 有點難以描述的問題(轉列+排序+去重)排序
- 2020重新出發,JAVA入門,關鍵字&保留字Java
- git 入門教程之回到過去Git
- 10W資料匯入該如何與庫中資料去重?
- 切片去重(string,int型別去重)型別
- TreeSet
- JS陣列去重 – JSON陣列去重陣列JSON
- JAVA入門程式Java
- java分散式(java入門)Java分散式
- java基礎:HashSet/LinkedHashSet/TreeSet — 原始碼分析Java原始碼
- 死磕 java集合之TreeSet原始碼分析Java原始碼
- 列表去重
- Java FX 簡介 與 IDEA JavaFX 開發入門JavaIdea
- 陣列及陣列物件操作 ----------包括排序,去重,合併,翻轉等陣列物件排序