想要让TreeSet集合中元素进行排序 有三种方式
1要添加的元素对应的类实现java.lang.Comparable接口,并实现compareTo方法
2 让SortedSet集合做到排序还有一种方法,java.util.Comparator比较器类
3 写一个匿名内部类 ,还是 java.util.Comparator
默认的一些类型中,都实现了比较器,比如Date,String,Integer等等
所以 我们自定义类一个数据类型的时候(类),当需要对这个类对象进行排序,就需要我们自定义比较器,用于比较
如果 两种排序方式都有的话,优先使用compare()方法
源码中是这样调用的,先判断有没有compare(),如果没有再去执行compareTo(),在TreeMap类中的1294行
Comparable
我们叫做元素自身的比较器,就是要添加的元素需要实现这个接口,这种情况下一般用于我们自定义的类中
Comparator
比较器类,常应用于:比如Integer是默认升序,我想降序,就需要使用Comparator来重新设置排序,因为它的优先级高
如果添加的元素不是我们自定义的类,
1 该类有排序(实现了Comparable), 但不是我们想要的排序效果,需要使用 Comparator 来进行调整排序,因为它的优先级高
2 如果该类没有排序(没有实现Comparable),我们就需要使用Comparator来设置排序,因为这个时候我们不可能去更改人家的源
码,不可能让这个类去实现Comparable的
如果一个类没有实现Comparable接口,那么把对象放到list中之后,不能直接调用sort(list)进行排序
但是可以使用sort的方法重载,sort(list,比较器类),来实现对list的排序
public class Collection_11_SortedSet {
public static void main(String[] args) {
// SortedSet products = new TreeSet(new ProductComparator());
SortedSet products = new TreeSet(new Comparator() {
public int compare(Object o1, Object o2) {
//o1是要添加的元素
//o2是集合中的元素
double price1 = ((Product1)o1).price;
double price2 = ((Product1)o2).price;
if(price1 == price2) {
return 0;
}else if(price1 > price2) {
return 1;
}else {
return -1;
}
}
});
Product1 p1 = new Product1(1.5);
Product1 p2 = new Product1(2.2);
Product1 p3 = new Product1(0.5);
products.add(p1);
products.add(p2);
products.add(p3);
System.out.println(products);
}
}
class Product1{
double price;
public Product1(double price) {
super();
this.price = price;
}
public String toString() {
return "Produvt1[price=" + price + "]";
}
}
//class ProductComparator implements Comparator{
//
// @Override
// public int compare(Object o1, Object o2) {
// // o1是要添加的元素
// // o2是集合中的元素
// double price1 = ((Product1)o1).price;
// double price2 = ((Product1)o2).price;
// if (price1 == price2) {
// return 0;
// }else if (price1 > price2) {
// return 1;
// }else {
// return -1;
// }
// }
//
//}
public class Collection_12_SortedList {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(new User1(18));
list.add(new User1(14));
list.add(new User1(20));
Collections.sort(list,new Comparator(){
public int compare(Object o1, Object o2) {
return ((User1)o1).age - ((User1)o2).age;
}
});
System.out.println(list);
}
}
class User1{
int age;
public User1(int age) {
super();
this.age = age;
}
public String toString() {
return "User1 [age=" + age + "]";
}
}