一:基本介绍
List集合对元素排序的方法有两种
1.元素自己实现了Comparable接口 实现了一个自然排序(自己比较完成的)直接添加进集合就是排好顺序的。
2.我们通过传入实现了一个Comparator接口实现一个排序(外部程序比较实现)。我们定义一个比较器,然后把这个比较器传入进去
Collections.sort(list,new X());
Set<Integer> set=new TreeSet<>(new TP());
其中 new x(),new TP()就是一个比较器对象。
它们的区别有三点:
1.存在包结构不同:
java.lang.Comparable 语言基础包
java.util.Comparator 工具包
2.当中的抽象方法不同:
Comparable compareTo(1)
Comparator compare(1,2)
最重要的是它们的语境 语义完全不同
Comparable adj.形容词
有能力去比较的
Comparator n.名词
比较专用的工具 比较器
一个类实现了Comparable接口就代表这个类的对象
是有比较排序的能力的
可以直接放进TreeSet集合当中
实现该接口的类的对象自动拥有排序功能
如果a > b,int>0;如果a=b,int=0;如果a<b,int<0。
一个类实现了Comparator接口就代表这个类的对象
是用来比较另一种对象的工具而已
它应该在TreeSet构造方法当中传参
https://blog.youkuaiyun.com/u012250875/article/details/55126531
二:代码使用案例
Comparator
import java.util.*;
public class ExecComparator{
public static void main(String[] args){
List<Book> list = new ArrayList<>();
Book bk1 = new Book("CoreJava",132);
Book bk2 = new Book("Thinking in Java",98);
Book bk3 = new Book("Effective Java",60);
Collections.addAll(list,bk1,bk2,bk3);
//请将书籍按照名字字母顺序排序
//Collections.sort(list,new X());
Collections.sort(list,new X());
//list.forEach(System.out::println);//jdk8 lambda
list.forEach((x) -> System.out.println("这本书叫:"+x));
list.stream().filter(x -> x.name.startsWith("C")).forEach(System.out::println);
/*
for(Book bk : list){
if(bk.name.startsWith("C")){
System.out.println(bk);
}
}
*/
}
}
class X implements Comparator<Book>{
@Override
public int compare(Book b1,Book b2){
return b1.name.compareTo(b2.name);
}
}
class Book {
String name;
int price;
public Book(String name,int price){
this.name = name;
this.price = price;
}
@Override
public String toString(){
return name + " : " + price;
}
}
import java.util.*;
public class TestComparator{
public static void main(String[] args){
Set<Integer> set=new TreeSet<>(new TP());
Collections.addAll(set,55,33,11,44,22);
System.out.println(set);
}
}
class TP implements Comparator<Integer>{
@Override
public int compare(Integer i1,Integer i2){
return i2 - i1;
}
}
Comparable
import java.util.*;
public class Exec4{
public static void main(String[] args){
TreeSet<Ball> set = new TreeSet<>();
Ball b1 = new Ball(4,"红色");
Ball b2 = new Ball(1,"黄色");
Ball b3 = new Ball(9,"灰色");
Collections.addAll(set,b1,b2,b3);
//[1:黄色,4:红色,9:灰色]
System.out.println(set);
}
}
/**
实现:implements
接口:Comparable<泛型>
方法:compareTo(泛型 x) -> int
按照球号升序排序
*/
class Ball implements Comparable<Ball>{
int number;
String color;
public Ball(int number,String color){
this.number = number;
this.color = color;
}
@Override
public int compareTo(Ball b1){
Ball x1 = this;
Ball x2 = b1;
int n1 = x1.number;
int n2 = x2.number;
return n1 - n2;//新元素 - 老元帅 -》 升序
//return n2 - n1;//老元素 - 新元素 -》 降序
}
@Override
public String toString(){
return number + ":" + color;
}
}