集合框架-TreeSet集合
(3)TreeSet集合
TreeSet類概述
使用元素的自然順序對元素進行排序
或者根據建立set時提供的Comparator進行排序
具體取決於使用的構造方法
A:底層資料結構是紅黑樹(是一個自平衡的二叉樹)
B:保證元素的排序方式
a:自然排序(元素具備比較性)
讓元素所屬的類實現Comparable介面
b:比較器排序(集合具備比較性)
讓集合構造方法接收Comparator的實現類物件
C:把我們講過的程式碼看一遍即可
package cn.itcast_05;
import java.util.TreeSet;
/*
* TreeSet:能夠對元素按照某種規則進行排序。
* 排序有兩種方式
* A:自然排序
* B:比較器排序
*
* TreeSet集合的特點:排序和唯一
*
* 通過觀察TreeSet的add()方法,我們知道最終要看TreeMap的put()方法。
*/
public class TreeSetDemo {
public static void main(String[] args) {
// 建立集合物件
// 自然順序進行排序
TreeSet<Integer> ts = new TreeSet<Integer>();
// 建立元素並新增
// 20,18,23,22,17,24,19,18,24
ts.add(20);//自動裝箱,可以直接新增
ts.add(18);
ts.add(23);
ts.add(22);
ts.add(17);
ts.add(24);
ts.add(19);
ts.add(18);
ts.add(24);
// 遍歷
for (Integer i : ts) {
System.out.println(i);
}
}
}
--------------------------------------------------------------------------------------------------------------------------
package cn.itcast_06;
import java.util.TreeSet;
/*
* 需求:請按照姓名的長度排序
*/
public class TreeSetDemo {
public static void main(String[] args) {
// 建立集合物件
TreeSet<Student> ts = new TreeSet<Student>();
// 建立元素
Student s1 = new Student("linqingxia", 27);
Student s2 = new Student("zhangguorong", 29);
Student s3 = new Student("wanglihong", 23);
Student s4 = new Student("linqingxia", 27);
Student s5 = new Student("liushishi", 22);
Student s6 = new Student("wuqilong", 40);
Student s7 = new Student("fengqingy", 22);
Student s8 = new Student("linqingxia", 29);
// 新增元素
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
ts.add(s6);
ts.add(s7);
ts.add(s8);
// 遍歷
for (Student s : ts) {
System.out.println(s.getName() + "---" + s.getAge());
}
}
}
package cn.itcast_05;
/*
* 如果一個類的元素要想能夠進行自然排序,就必須實現自然排序介面
*/
public class Student implements Comparable<Student> {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
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;
// 次要條件
// 年齡相同的時候,還得去看姓名是否也相同,而姓名是String型別,本身已經實現了Comparable介面,直接拿來用就可以了
// 如果年齡和姓名都相同,才是同一個元素
int num2 = num == 0 ? this.name.compareTo(s.name) : num;
return num2;
}
/*
難點:要做自然排序,就必須去實現Comparable介面,
寫主要條件和次要條件程式碼取決於我給出的排序條件
還要知道次要條件的分析
*/
}
說明:
public int compareTo(Student s){
int num = this.age - s.age;
return num;
}
第一次this.age為27、s.age為27
第二次:this.age為29,但s.age還是為27,那麼以後的age都和第一次的27來比較了
---------------------------------------------------------------------------------------------------------------------------
package cn.itcast_06;
import java.util.TreeSet;
/*
* 需求:請按照姓名的長度排序
*/
public class TreeSetDemo {
public static void main(String[] args) {
// 建立集合物件
TreeSet<Student> ts = new TreeSet<Student>();
// 建立元素
Student s1 = new Student("linqingxia", 27);
Student s2 = new Student("zhangguorong", 29);
Student s3 = new Student("wanglihong", 23);
Student s4 = new Student("linqingxia", 27);
Student s5 = new Student("liushishi", 22);
Student s6 = new Student("wuqilong", 40);
Student s7 = new Student("fengqingy", 22);
Student s8 = new Student("linqingxia", 29);
// 新增元素
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
ts.add(s6);
ts.add(s7);
ts.add(s8);
// 遍歷
for (Student s : ts) {
System.out.println(s.getName() + "---" + s.getAge());
}
}
}
package cn.itcast_06;
/*
* 如果一個類的元素要想能夠進行自然排序,就必須實現自然排序介面
*/
public class Student implements Comparable<Student> {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
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) {
// 主要條件 姓名的長度
int num = this.name.length() - s.name.length();
// 姓名的長度相同,不代表姓名的內容相同
int num2 = num == 0 ? this.name.compareTo(s.name) : num;
// 姓名的長度和內容相同,不代表年齡相同,所以還得繼續判斷年齡
int num3 = num2 == 0 ? this.age - s.age : num2;
return num3;
}
}
---------------------------------------------------------------------------------------------------------------------------
package cn.itcast_07;
import java.util.Comparator;
import java.util.TreeSet;
/*
* 需求:請按照姓名的長度排序
*
* TreeSet集合保證元素排序和唯一性的原理
* 唯一性:是根據比較的返回是否是0來決定。
* 排序:
* A:自然排序(元素具備比較性)
* 讓元素所屬的類實現自然排序介面 Comparable
* B:比較器排序(集合具備比較性)
* 讓集合的構造方法接收一個比較器介面的子類物件 Comparator
*/
public class TreeSetDemo {
public static void main(String[] args) {
// 建立集合物件
// TreeSet<Student> ts = new TreeSet<Student>(); //自然排序
// public TreeSet(Comparator comparator) //比較器排序
// 定義個類比較器
// TreeSet<Student> ts = new TreeSet<Student>(new MyComparator());
// 如果一個方法的引數是介面,那麼真正要的是介面的實現類的物件
// 而匿名內部類就可以實現這個東西,一般開發中用匿名內部類搞定
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
// 姓名長度
int num = s1.getName().length() - s2.getName().length();
// 姓名內容
int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
// 年齡
int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
return num3;
}
});
// 建立元素
Student s1 = new Student("linqingxia", 27);
Student s2 = new Student("zhangguorong", 29);
Student s3 = new Student("wanglihong", 23);
Student s4 = new Student("linqingxia", 27);
Student s5 = new Student("liushishi", 22);
Student s6 = new Student("wuqilong", 40);
Student s7 = new Student("fengqingy", 22);
Student s8 = new Student("linqingxia", 29);
// 新增元素
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
ts.add(s6);
ts.add(s7);
ts.add(s8);
// 遍歷
for (Student s : ts) {
System.out.println(s.getName() + "---" + s.getAge());
}
}
}
package cn.itcast_07;
import java.util.Comparator;
public class MyComparator implements Comparator<Student> {
//一般開發中用匿名內部類搞定,不需要重新定義個類比較器出來
@Override
public int compare(Student s1, Student s2) {
// int num = this.name.length() - s.name.length();
// this -- s1
// s -- s2
// 姓名長度,不在一個類中,用get拿
int num = s1.getName().length() - s2.getName().length();
// 姓名內容
int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
// 年齡
int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
return num3;
}
}
package cn.itcast_07;
public class Student {
private String name;
private int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
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;
}
}
---------------------------------------------------------------------------------------------------------------------------
下面例子也是用匿名內部類的方法,源自:http://blog.csdn.net/wuya112709/article/details/51407754
public class Studentdemo {
public static void main(String[] args) {
TreeSet ts1 = new TreeSet(new Comparator() {
public int compare(Object o1, Object o2) {
Student s1 = (Student) o1;
Student s2 = (Student) o2;
return s1.age > s2.age ? 1 : -1;
}
});
ts1.add(new Student("mm", 21, 97005));
ts1.add(new Student("jerry", 19, 97003));
ts1.add(new Student("tom", 16, 97004));
ts1.add(new Student("mm", 28, 97008));
ts1.add(new Student("mm", 23, 97006));
System.out.println("語句return s1.age > s2.age ? 1 : -1;是按照???排列的:");
System.out.println(ts1);
}
}
相關文章
- 【java】【集合】TreeSetJava
- Java集合框架原始碼剖析:TreeSet 和 TreeMapJava框架原始碼
- 集合框架-TreeSet的add()方法的原始碼解析框架原始碼
- List集合(ArrayList-LinkedList);Set集合(HashSet-TreeSet)
- 使用TreeSet構造排序的集合排序
- Set集合的直接子類TreeSet
- 集合框架-TreeMap集合框架
- 集合框架-Set集合框架
- 集合框架-Collection集合框架
- 集合框架-List集合框架
- 【集合框架】Java集合框架綜述框架Java
- 集合框架-集合總結框架
- 集合框架-List集合-2框架
- 集合框架-List集合-3框架
- 集合框架-Collection集合-2框架
- 集合框架-Collection集合-3框架
- Java Set 常用集合 HashSet、LinkedHashSet、TreeSetJava
- 集合框架-Map集合功能概述框架
- 集合框架-HashMap集合的案例框架HashMap
- Java集合(1)一 集合框架Java框架
- 集合框架-Collection集合總結框架
- 集合框架框架
- 死磕 java集合之TreeSet原始碼分析Java原始碼
- 集合框架-Map集合的遍歷框架
- Java集合框架系列教程一:集合框架簡介Java框架
- Java 集合框架Java框架
- 集合框架-Collections框架
- java集合框架Java框架
- 【Java集合原始碼剖析】Java集合框架Java原始碼框架
- 集合框架-集合的巢狀遍歷框架巢狀
- 【JAVA集合】JAVA集合框架及其常用方法Java框架
- Java集合(3)一 紅黑樹、TreeMap與TreeSet(上)Java
- Java集合(4)一 紅黑樹、TreeMap與TreeSet(下)Java
- 「譯」Java集合框架系列教程二:集合介面Java框架
- 集合框架-增強for框架
- 10.集合框架框架
- 集合框架-TreeSet保證元素唯一性和自然排序的原理和圖解框架排序圖解
- 集合------集合框架Collection/Iterator迭代器/增強for迴圈框架