sort和Comparator
class test{
public static void main(String[] args) {
List<Integer> list=new ArrayList<>(Arrays.asList(1,2,3,4,5));
list.sort((t1,t2)->t2-t1);
list.forEach(System.out::println);
}
}
- 每次写sort的时候若我们需要按自己的排序规则来写的话都需要实现一个Comparator
- 我们用Lambda表达式的话很容易就实现从大到小排序,而且更加简洁。
foreach
list.forEach(t->System.out.println(t));
- 不过上面的代码会爆警告,Can be replaced with method reference less,我们可以修改一下。
list.forEach(System.out::println);
- Comparator内置的一些default方法完全能实现简单排序规则
- 例如Comparator的comparing对整型的值进行排序
- reversed()即采取和你之前的排序规则相反的规则来对list进行排序
public class LambdaTest {
@Test
public void test(){
List<Integer> list=new ArrayList<>(Arrays.asList(1,3,2,5,4));
Comparator<Integer> comparator=Comparator.comparing(Integer::intValue);
list.sort(comparator);
list.forEach(System.out::println);
list.sort(comparator.reversed());
list.forEach(System.out::println);
}
}
- 如果是我们自定义的类,这里我们实现了一个Fruit类,利用Comparator我们实现了自定义的类按照价格的大小从小
到大排序 Comparator.comparing(Fruit::getPrice)
public class LambdaTest {
class Fruit{
int id;
String name;
int price;
public Fruit(int id, String name, int price) {
this.id = id;
this.name = name;
this.price = price;
}
public int getPrice() {
return price;
}
@Override
public String toString() {
return "Fruit"+id+": name="+name+", price="+price;
}
}
@Test
public void test1(){
List<Fruit> list=new ArrayList<>();
list.add(new Fruit(1,"Apple",18));
list.add(new Fruit(2,"Banana",15));
list.add(new Fruit(3,"Orange",17));
Comparator<Fruit> comparator=Comparator.comparing(Fruit::getPrice);
list.sort(comparator);
list.forEach(System.out::println);
}
}
- 可是往往我们不止是根据对象的一个成员变量来进行排序,我们需要更加多个成员变量来进行排序,多个成员组合排序
使用到了comparator.thenComparing(comparator1) 这里我们先按价格的大小排序,如果价格相同,我们利用
水果名字字典序较小的进行排序。
public class LambdaTest {
@Test
public void test1(){
List<Fruit> list=new ArrayList<>();
list.add(new Fruit(1,"Apple",18));
list.add(new Fruit(2,"Banana",15));
list.add(new Fruit(3,"Orange",17));
list.add(new Fruit(4,"Apple",15));
Comparator<Fruit> comparator=Comparator.comparing(Fruit::getPrice);
Comparator<Fruit> comparator1=Comparator.comparing(Fruit::getName);
list.sort(comparator.thenComparing(comparator1));
list.forEach(System.out::println);
}
}
- 如果不写Comparator直接在sort里面写排序规则,那么大概就如下,年龄不同按年龄排序,年龄相同按字典序排序
list.sort((t1,t2)->(t1.price-t2.price!=0)?t1.price-t2.price:t1.name.compareTo(t2.name))