Java集合中的排序方法
1.1.1. Comparable介面(瞭解)
預設情況下,TreeSet中的元素會採用自然排序(從小到大),此時要求元素物件必須實現java.util.Comparable介面,大多數JDK自帶的類都實現了該介面,比如八大包裝類和String。
TreeSet會呼叫元素的compareTo方法來比較元素的大小關係,然後將集合元素按照升序排列。
public interface Comparable<T> {
public int compareTo(T o);
}
比較規則,拿當前元素和另一個元素做比較:
this > o:返回正整數 1 ,優先順序較高
this < o:返回負整數 -1 ,優先順序較低
this == o: 返回 0 ,此時認為兩個物件為同一個物件。
此時compareTo方法返回0,則認為兩個物件是同一個物件,返回正數排前面,返回負數排後面。
如果我們自定義一個類,需要儲存到TreeSet中,此時我們需要讓該類實現Comparable介面,並覆蓋compareTo方法,在該方法編寫比較規則。
需求:按照使用者的年齡從小到大排序
class User implements java.lang.Comparable<User> {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
//比較規則
public int compareTo(User o) {
if (this.age > o.age) {
return 1;
} else if (this.age < o.age) {
return -1;
}
return 0;
}
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
public class ComparableDemo{
public static void main(String[] args) {
Set<User> set = new TreeSet<>();
set.add(new User("stef", 28));
set.add(new User("will", 17));
set.add(new User("allen", 15));
set.add(new User("Lucy", 22));
System.out.println(set);
}
}
輸出結果:
[User [name=allen, age=15], User [name=will, age=17], User [name=Lucy, age=22], User [name=stef, age=28]]
第一步:第一個節點進去,直接作為根節點,無需比較
第二步:第二個節點進去和第一個節點作比較,此時的this表示第二個節點,如果compareTo返回-1,則插入節點往左邊走。
第三步:第三個節點進去和第一個節點做比較,返回-1,再和第二個節點做比較。
第四步:由於TreeSet是平衡二叉樹,如果樹不平衡,會對節點進行調整。
第五步:第四個節點進去先和will比較,再和stef比較。
1.1.2. Comparator介面(瞭解)
TreeSet除了預設支援自然排序外,還支援自定義排序,此時需要在構建TreeSet物件時傳遞java.util.Comparator介面的實現類物件,Comparator表示比較器,裡面封裝比較規則。
public interface Comparator<T> {
int compare(T o1, T o2);
}
此時compare方法返回0,則認為兩個物件是同一個物件,返回正數排前面,返回負數排後面。
需求:根據使用者的名字長度排序,如果名字相同按照年齡排序。
class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
public class App {
public static void main(String[] args) {
Set<User> set = new TreeSet<>(**new NameLengthComparator()**);
set.add(new User("James", 30));
set.add(new User("Bryant", 22));
set.add(new User("Allen", 28));
set.add(new User("Will", 17));
System.out.println(set);//
}
}
class NameLengthComparatorimplements java.util.Comparator<User> {
public int compare(User o1, User o2) {
int ret = o1.getName().length() - o2.getName().length();
if (ret > 0) {
return 1;
} else if (ret < 0) {
return -1;
} else {
if (o1.getAge() > o2.getAge()) {
return 1;
} else if (o1.getAge() < o2.getAge()) {
return -1;
} else {
return 0;
}
}
}
}
輸出結果:
[User [name=Will, age=17], User [name=Allen, age=28], User [name=James, age=30], User [name=Bryant, age=22]]
小結:HashSet做等值查詢效率高,TreeSet做範圍查詢效率高,在開發中一般使用HashSet就可以了。
若要獲得最好的學習效果,需要配合對應教學視訊一起學習。需要完整教學視訊,請參看https://ke.qq.com/course/272077。
相關文章
- Java 集合中的排序演算法淺析Java排序演算法
- 好程式設計師Java培訓分享Java集合的兩種排序方法程式設計師Java排序
- Map集合的按時間排序方法排序
- Java 集合排序策略介面 ComparatorJava排序
- java集合物件排序總結Java物件排序
- 【JAVA集合】JAVA集合框架及其常用方法Java框架
- java中的Map集合Java
- Java遍歷Map集合的方法Java
- js中 的排序方法JS排序
- Java集合中的框架2Java框架
- Java集合 HashSet的原理及常用方法Java
- 【Java】【集合】collection介面常見方法、集合轉陣列toArray()、帶ALL的方法Java陣列
- 【Java集合】單列集合Collection常用方法詳解Java
- JAVA裡List集合中的物件根據物件的某個屬性值降序或者升序排序Java物件排序
- Go 中的三種排序方法Go排序
- 設計模式:策略模式,Java集合定製排序的核心思想設計模式Java排序
- Java集合框架中的介面和類Java框架
- java集合中的常見考點Java
- Java中的併發集合詳解Java
- java.util.Collection集合方法:Collections.BinarySearch 方法Java
- java中展開樹集合Java
- 排序演算法集合排序演算法
- Java中的Map集合學習筆記Java筆記
- Java 中的泛型 集合(List,Set) MapJava泛型
- Java中如何快捷的建立不可變集合Java
- #Java集合的組內平均值的計算方法Java
- java中的方法Java
- Java中List集合轉Map集合報錯:Duplicate keyJava
- pandas | DataFrame中的排序與彙總方法排序
- Java 不可變集合 Stream流以及方法引用Java
- Java中List集合效能比較Java
- java中避免集合死鏈呼叫Java
- Java中的合併排序演算法Java排序演算法
- Java面試題:Java中的集合及其繼承關係Java面試題繼承
- Java集合/陣列排序知識與IO流結合例項Java陣列排序
- Java 中的方法引用Java
- 【Java集合原始碼剖析】Java集合框架Java原始碼框架
- 【Java集合】1 集合概述Java