日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TreeSet()详解

發布時間:2023/12/9 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TreeSet()详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?/*
?* TreeSet存儲對象的時候, 可以排序, 但是需要指定排序的算法
?*?
?* Integer能排序(有默認順序), String能排序(有默認順序), 自定義的類存儲的時候出現異常(沒有順序)
?*?
?* 如果想把自定義類的對象存入TreeSet進行排序, 那么必須實現Comparable接口
?* ??在類上implement Comparable
?* ??重寫compareTo()方法
?* ??在方法內定義比較算法, 根據大小關系, 返回正數負數或零
?* ??在使用TreeSet存儲對象的時候, add()方法內部就會自動調用compareTo()方法進行比較, 根據比較結果使用二叉樹形式進行存儲
?*/

2.TreeSet是依靠TreeMap來實現的。
TreeSet是一個有序集合,TreeSet中的元素將按照升序排列,缺省是按照自然排序進行排列,意味著TreeSet中的元素要實現Comparable接口。或者有一個自定義的比較器。
我們可以在構造TreeSet對象時,傳遞實現Comparator接口的比較器對象。

import java.util.Iterator; import java.util.*;public class TreeSetTest {public static void main(String[] args) {Set ts = new TreeSet();ts.add("abc");ts.add("xyz");ts.add("rst");Iterator it = ts.iterator();while (it.hasNext()) {System.out.println(it.next());}} }

輸出結果:

abc

rst

xyz

打印結果不是和先前加入的順序一樣,它是按照一個字母的排序法進行排序的。這是因為String 類實現了Comparable接口。

如果我們自己定義的一個類的對象要加入到TreeSet當中,那么這個類必須要實現Comparable接口。

package test.treeset; import java.util.Iterator; import java.util.Set; import java.util.TreeSet;public class test_treeset {@SuppressWarnings("unchecked")public static void main(String[] args) {Set ts = new TreeSet();ts.add(new Teacher("zhangsan", 1));ts.add(new Teacher("lisi", 2));ts.add(new Teacher("wangmazi", 3));ts.add(new Teacher("wangwu",4));ts.add(new Teacher("mazi", 3));Iterator it = ts.iterator();while (it.hasNext()) {System.out.println(it.next());}} } class Teacher implements Comparable {int num;String name;Teacher(String name, int num) {this.num = num;this.name = name;}public String toString() {return "學號:" + num + "\t\t姓名:" + name;}//o中存放時的紅黑二叉樹中的節點,從根節點開始比較public int compareTo(Object o) {Teacher ss = (Teacher) o;int result = num < ss.num ? 1 : (num == ss.num ? 0 : -1);//降序//int result = num > ss.num ? 1 : (num == ss.num ? 0 : -1);//升序if (result == 0) {result = name.compareTo(ss.name);}return result;} }

運行結果:

學號:4 姓名:wangwu
學號:3 姓名:mazi
學號:3 姓名:wangmazi
學號:2 姓名:lisi
學號:1 姓名:zhangsan

3.比較器

在使用Arrays對數組中的元素進行排序的時候,可以傳遞一個比較器。

在使用Collections對集合中的元素進行排序的時候,可以傳遞一個比較器。

那么在使用TreeSet對加入到其中的元素進行排序的時候可以傳入一個比較器嗎?

public TreeSet(Comparator<? super E> comparator) {this(new TreeMap<E,Object>(comparator));}

通過查看它的構造方法就知道可以傳入一個比較器。

構造一個新的空TreeSet,它根據指定比較器進行排序。插入到該 set 的所有元素都必須能夠由指定比較器進行相互比較:對于 set 中的任意兩個元素 e1 和e2,執行 comparator.compare(e1, e2) 都不得拋出 ClassCastException。如果用戶試圖將違反此約束的元素添加到 set 中,則 add 調用將拋出 ClassCastException。

package test.treeset;import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet;public class TreeSetTest {@SuppressWarnings("unchecked")public static void main(String[] args) {TreeSet ts = new TreeSet(new Teacher2.TeacherCompare());ts.add(new Teacher2("zhangsan", 2));ts.add(new Teacher2("lisi", 1));ts.add(new Teacher2("wangmazi", 3));ts.add(new Teacher2("mazi", 3));Iterator it = ts.iterator();while (it.hasNext()) {System.out.println(it.next());}} }class Teacher2 {int num;String name;Teacher2(String name, int num) {this.num = num;this.name = name;}public String toString() {return "學號:" + num + " 姓名:" + name;}static class TeacherCompare implements Comparator {// 老師自帶的一個比較器//o1中存放的事目標節點//o2中存放時的紅黑二叉樹中的節點,從根節點開始比較public int compare(Object o1, Object o2) {Teacher2 s1 = (Teacher2) o1;// 轉型Teacher2 s2 = (Teacher2) o2;// 轉型int result = s1.num > s2.num ? 1 : (s1.num == s2.num ? 0 : -1);if (result == 0) {result = s1.name.compareTo(s2.name);}return result;}}}

運行結果:

學號:1 姓名:lisi
學號:2 姓名:zhangsan
學號:3 姓名:mazi
學號:3 姓名:wangmazi

?

轉載于:https://www.cnblogs.com/chen-lhx/p/4316439.html

總結

以上是生活随笔為你收集整理的TreeSet()详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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