TreeSet集合如果要对添加的元素进行排序,则添加的元素所属的类要实现Comparable接口(基本类型的包装类,String类都文现了该接口),Comparable接口的compareTo()方法内会用自然比较方法对元素排序,这种排序称为类的自然排序。
如果将自定义的IPhone对象存入TreeSet,TreeSet将不会对添加的元素进行排序,IPhone对象所属的类可以通过实现Comparable接口并重写compareTo()方法实现对象元素的顺序存取。
TreeSet集合还有另一种实现排序的方式。即通过实现?Comparator接口,并实现compare()方法,这种排序称为比较器排序。
package demo1;
import java.util.Collection;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
/**
* 目标:观察TreeSet对于有值特性的数据如何排序。
* 学会对自定义类型的对象进行指定规则排序
*/
public class SetDemo2 {
public static void main (String[] args){
// 方式一:使用TreeSet集合存储元素(采用默认的排序方式)
Set<Integer> sets = new TreeSet<>(); // 不重复 无索引 可排序
sets.add(22);
sets.add(24);
sets.add(11);
sets.add(11);
sets.add(8);
System.out.println(sets);
//打印结果: [8, 11, 22, 24]
Collection books=new TreeSet();// 不重复 无索引 可排序
books.add ("Java就该这样学");
books.add ("Java就该这样学");
books.add ("Java编程基础");
books.add ("Java编程基础");
books.add("javaWeb基础");
System.out.println(books);
//打印结果:[Java就该这样学, Java编程基础, javaWeb基础]
// 方式二:进行规则定制
Set<IPhone> phones=new TreeSet<>(new Comparator<IPhone>() {
public int compare(IPhone o1, IPhone o2) {
//return (int)(o1.getPrice()-o2.getPrice());//升序
//return (int)(o2.getPrice()-o1.getPrice());//降序
// 注意:浮点型建议直接使用Double.compare进行比较
//return Double.compare(o1.getPrice(),o2.getPrice());//升序
return Double.compare(o2.getPrice(),o1.getPrice());//降序
}
});
/*Set<IPhone> phones2=new TreeSet<>(
(o1, o2)->0
);*/
IPhone i14=new IPhone("iphone14",6299.0);
IPhone i14Pro=new IPhone("iphone14Pro",7299.0);
IPhone i13=new IPhone("iphone13",5299.0);
phones.add(i14);
phones.add(i14Pro);
phones.add(i13);
System.out.println(phones);
//打印结果:[IPhone{model='iphone14Pro', price=7299.0},
// IPhone{model='iphone14', price=6299.0},
// IPhone{model='iphone13', price=5299.0}]
}
}
class IPhone{
private String model;
private Double price;
public Double getPrice() {
return price;
}
public IPhone(String model, Double price) {
this.model = model;
this.price = price;
}
public String toString() {
return "IPhone{" +
"model='" + model + '\'' +
", price=" + price +
'}';
}
}