日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

第三次学JAVA再学不好就吃翔(part90)--TreeSet

發布時間:2023/12/19 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第三次学JAVA再学不好就吃翔(part90)--TreeSet 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學習筆記,僅供參考,有錯必糾


文章目錄

    • TreeSet
      • TreeSet存儲自定義對象
        • Comparable接口
        • 定義Dog類實現Comparable接口
      • 比較器
        • Comparator接口的方法
        • 實現Comparator方法的案例
      • TreeSet原理



TreeSet


該類基于TreeMap的 NavigableSet 實現,使用元素的自然順序對元素進行排序,或者根據創建 set 時提供的Comparator進行排序,具體取決于使用的構造方法。


  • 舉個例子
package com.guiyang.restudy3;import java.util.TreeSet;public class D3TreeSet {public static void main(String[] args) {TreeSet<Integer> ts = new TreeSet<>();ts.add(3);ts.add(1);ts.add(1);ts.add(2);ts.add(2);ts.add(3);ts.add(3); System.out.println(ts);} }

輸出:

[1, 2, 3]

TreeSet存儲自定義對象


Comparable接口


此接口強行對實現它的每個類的對象進行整體排序。這種排序被稱為類的自然排序,類的 compareTo 方法被稱為它的自然比較方法


  • compareTo方法
int compareTo(T o)

比較此對象與指定對象的順序。如果該對象小于、等于或大于指定對象,則分別返回負整數、零或正整數。


定義Dog類實現Comparable接口


現在,我們構造Dog類,并實現Comparable接口,并重寫compareTo方法:

package com.guiyang.eclipse;public class Dog implements Comparable<Dog>{private String name;private int age;public Dog(String name, int age) {this.name = name;this.age = age;}public Dog() {}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;}@Overridepublic int compareTo(Dog o) {return 0;//return 1; //return -1;}@Overridepublic String toString() {return "<name:" + name + ", age:" + age + ">";} }

需要注意的是,當compareTo方法返回值恒為0的時候,TreeSet集合中只有一個元素,當compareTo方法返回值恒為正數(比如1)時,TreeSet集合會怎么存就怎么取,當compareTo方法返回值恒為負數時(比如-1),TreeSet集合會按照倒序存儲。


我們按照age和name的大小,重寫compareTo方法:

@Override public int compareTo(Dog o) { int num = this.age - o.age; return num == 0 ? this.name.compareTo(o.name) : num; //上述代碼表示,年齡相同比較name,不相同則返回num //String類已經對compareTo方法進行了重寫,返回一個int值 }

現在我們用TreeSet存儲自定義Dog類:

package com.guiyang.restudy3;import java.util.Comparator; import java.util.TreeSet;import com.guiyang.eclipse.Dog;public class D4TreeSetDog {public static void main(String[] args) {TreeSet<Dog> ts = new TreeSet<>();ts.add(new Dog("Huang", 9));ts.add(new Dog("Black", 10));ts.add(new Dog("Pink", 5));ts.add(new Dog("Green", 10));ts.add(new Dog("Huang", 12));System.out.println(ts);} }

輸出:

[<name:Pink, age:5>, <name:Huang, age:9>, <name:Black, age:10>, <name:Green, age:10>, <name:Huang, age:12>]

比較器


我們看一個TreeSet的有參構造方法:

TreeSet(Comparator<? super E> comparator)

構造一個新的空TreeSet,它根據指定的比較器進行排序。


這個Comparator是一個接口,我們不能直接創建其對象,而需要先構造它的子類去實現該接口,并重寫接口里的方法。


Comparator接口的方法


  • compare方法
int compare(T o1, T o2)

比較用來排序的兩個參數。根據第一個參數小于、等于或大于第二個參數分別返回負整數、零或正整數。


  • equals方法
boolean equals(Object obj)

指示某個其他對象是否"等于"此 Comparator,僅當指定的對象也是一個 Comparator,并且強行實施與此 Comparator 相同的排序時,此方法才返回 true。因此,comp1.equals(comp2) 意味著對于每個對象引用 o1 和 o2 而言,都存在 sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))


實現Comparator方法的案例


package com.guiyang.restudy3;import java.util.Comparator; import java.util.TreeSet;public class D4TreeSetDog {public static void main(String[] args) {//將字符串按照長度排序TreeSet<String> ts = new TreeSet<>(new CompareByLen()); //Comparator c = new CompareByLen();ts.add("aaaaaaaa");ts.add("bbb");ts.add("ddddd");ts.add("aaa");ts.add("e");System.out.println(ts);} }class CompareByLen implements Comparator<String> {//默認繼承Object類,Object類中已經重寫了equels方法@Overridepublic int compare(String s1, String s2) { //按照字符串的長度比較int num = s1.length() - s2.length(); //長度為主要條件return num == 0 ? s1.compareTo(s2) : num; //內容為次要條件} }

輸出:

[e, aaa, bbb, ddddd, aaaaaaaa]

TreeSet原理


TreeSet是用來排序的,可以指定一個順序, 對象存入之后會按照指定的順序排列,這兩種順序分別為自然順序和比較器順序。


  • 自然順序(Comparable)
    • TreeSet類的add()方法中會把存入的對象提升為Comparable類型
    • 調用對象的compareTo()方法和集合中的對象比較
    • 根據compareTo()方法返回的結果進行存儲
  • 比較器順序(Comparator)
    • 創建TreeSet的時候可以制定 一個Comparator
    • 如果傳入了Comparator的子類對象, 那么TreeSet就會按照比較器中的順序排序
    • add()方法內部會自動調用Comparator接口中compare()方法排序
    • 調用的對象是compare方法的第一個參數,集合中已添加的對象是compare方法的第二個參數
  • 兩種方式的區別
    • 在TreeSet構造方法中,如果什么都不傳, 默認按照類中Comparable的規則進行比較(若該類沒有實現Comparable類,就會報出ClassCastException錯誤)
    • 在TreeSet構造方法中,如果傳入Comparator, 就優先按照Comparator的規則進行比較
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的第三次学JAVA再学不好就吃翔(part90)--TreeSet的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。