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 +'}';}
}