樹
案例1:
使用TreeSet存儲(chǔ)Employee對(duì)象疫稿,比較兩個(gè)屬性
int age, int weight 先按照年齡進(jìn)行升序排培他,如果年齡相等的話鹃两,按照體重升序排
package com.wyx.a_TreeSet;
import java.util.Set;
import java.util.TreeSet;
class Employ implements Comparable<Employ>{
String name;
int age;
int weight;
public Employ(String name, int age, int weight) {
this.name = name;
this.age = age;
this.weight = weight;
}
@Override
public String toString() {
return "Employ{" +
"name='" + name + '\'' +
", age=" + age +
", weight=" + weight +
'}';
}
@Override
public int compareTo(Employ o) {
//return一旦執(zhí)行,后面代碼不會(huì)在執(zhí)行
int num;
num = this.age - o.age;
if (num == 0){
return this.weight - o.weight;
}
return num;
}
}
public class Demo1 {
public static void main(String[] args) {
Set<Employ> set = new TreeSet<>();
set.add(new Employ("張三",18, 60));
set.add(new Employ("李四",18, 70));
set.add(new Employ("小明",18, 65));
set.add(new Employ("王五",19, 60));
set.add(new Employ("小花",19, 60));
System.out.println(set);
//[Employ{name='張三', age=18, weight=60}, Employ{name='小明', age=18, weight=65},
// Employ{name='李四', age=18, weight=70}, Employ{name='王五', age=19, weight=60}]
}
}
案例2:
TreeSet里面存的是Dog類靶壮,
兩個(gè)屬性: String name, int age
先按照字符串的順序排怔毛,然后字符串相等的話,在按照年齡排
需要借助String類下面的compareTo這個(gè)方法
compareTo(String anotherString)
功能介紹:
按字典順序比較兩個(gè)字符串腾降,返回的值是int類型
比較是基于字符串中每個(gè)字符的Unicode值。
由該String對(duì)象表示的字符序列按字典順序與由參數(shù)字符串表示的字符序列進(jìn)行比較碎绎。
如果String對(duì)象按字典順序排列在參數(shù)字符串之前螃壤,結(jié)果為負(fù)整數(shù)。
如果String對(duì)象按字典順序排列在參數(shù)字符串之后筋帖,結(jié)果為正整數(shù)奸晴。
如果字符串相等,結(jié)果為零;
代碼
package com.wyx.a_TreeSet;
import javax.xml.ws.Service;
import java.util.Set;
import java.util.TreeSet;
class Dog implements Comparable<Dog>{
String name;
int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Dog o) {
int num = this.name.compareTo(o.name);
if (num == 0) {
return this.age - o.age;
}
return num;
}
}
public class Demo2 {
public static void main(String[] args) {
Set<Dog> set = new TreeSet<>();
set.add(new Dog("旺財(cái)", 3));
set.add(new Dog("旺財(cái)", 2));
set.add(new Dog("Tom", 2));
set.add(new Dog("大黃", 2));
System.out.println(set);
//[Dog{name='Tom', age=2}, Dog{name='大黃', age=2},
// Dog{name='旺財(cái)', age=2}, Dog{name='旺財(cái)', age=3}]
}
}
總結(jié):使用TreeSet的時(shí)候需要類實(shí)現(xiàn)一個(gè)接口 Comparable這個(gè)接口去做比較排序
2.使用比較器將數(shù)據(jù)存儲(chǔ)到TreeSet中
另外一種進(jìn)行排序的方法日麸,Comparator這個(gè)接口
Set<T> set = new TreeSet<>();
構(gòu)造一個(gè)新的寄啼,空的樹組,根據(jù)其元素的自然排序進(jìn)行排序代箭。
Set<T> set = new TreeSet<>(Comparator <? super T> comparator);
構(gòu)造一個(gè)新的墩划,空的樹集,根據(jù)指定的比較器進(jìn)行排序嗡综。
package com.wyx.b_comparator;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
class Student{
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
class MyComparator implements Comparator<Student> {
/*
o1:代表當(dāng)前要添加的元素
o2:代表已經(jīng)在紅黑樹中存在的元素
返回值規(guī)則:
負(fù)數(shù)放左邊
正數(shù)放右邊
0不存
*/
@Override
public int compare(Student o1, Student o2) {
//按照年齡進(jìn)行排序
return o1.age - o2.age;
}
}
public class Demo1 {
public static void main(String[] args) {
//如果想要使用比較器的寫法 必須再new TreeSet的時(shí)候
//加上比較器對(duì)象
//TreeSet 有一個(gè)有參構(gòu)造乙帮,有參構(gòu)造的方法是Comparator的對(duì)象
//Comparator是一個(gè)接口 不能實(shí)例化,需要再寫一個(gè)類去實(shí)現(xiàn)這個(gè)接口
Set<Student> set = new TreeSet<>(new MyComparator());
set.add(new Student("張三", 23));
set.add(new Student("張三", 18));
set.add(new Student("張三", 20));
System.out.println(set);
//[Student{name='張三', age=18}, Student{name='張三', age=20},
// Student{name='張三', age=23}]
}
}
總結(jié):
ArrayList:不需要注意任何事項(xiàng)极景,只是單純存取數(shù)據(jù)而已察净。數(shù)據(jù)可以重復(fù) 有序的 開發(fā)經(jīng)常用LinkedList:不需要注意任何事項(xiàng),只是單純存取數(shù)據(jù)而已盼樟。數(shù)據(jù)可以重復(fù) 有序的
HashSet:數(shù)據(jù)不可重復(fù)氢卡,無(wú)序的。依靠哈希碼值存儲(chǔ)
注意:
當(dāng)存儲(chǔ)對(duì)象時(shí)候晨缴,關(guān)注的是對(duì)象內(nèi)容是否一樣译秦,如果對(duì)象內(nèi)容一樣,一定不能存到HashSet集合中喜庞,這個(gè)時(shí)候就需要重寫equals和hashCode方法诀浪。TreeSet:數(shù)據(jù)不可重復(fù),無(wú)序的延都。底層是二叉樹雷猪,TreeSet會(huì)進(jìn)行自然排序,一定要讓實(shí)體類去實(shí)現(xiàn)Comparable接口晰房,重寫comparato這個(gè)方法求摇,否則報(bào)錯(cuò)射沟,或者使用比較器Comparator這個(gè)接口,重寫compara方法