Java8中排序算法比较器的三种写法(使用lambda表达式实现Comparator比较器)

在涉及到数组, 集合等这些地方经常会需要用到排序算法, 在Java中的Collections类中有sort方法, 除了需要传入一个Comparator比较器, 或者需要排序的类实现了Comparable接口;
完整的测试代码附在最后面~

1.使用lambda表达式

我写了3种lambda表达式的写法:
第一种的解释可以看小标题3;
后面两种本质上是一个意思, 传入2个量, 返回比较他们的结果, p在列表的前面, q在列表的后面, 如果希望是升序排列, 就要后面的比前面的大, 就是q.length()-p.length()>0; 如果要降序就是前面的要比后面的大, 就是p.length()-q.length()>0; 也可以直接调用Integer的比较方法, 返回的具体值是两个元素的差值;

Collections.sort(Arrays.asList(s), Comparator.comparingInt(str->(str.length())));
Collections.sort(Arrays.asList(s), (p,q)->{
    return Integer.valueOf(p.length()).compareTo(q.length());
});
Collections.sort(Arrays.asList(s), (p,q)->{
    return p.length()-q.length();
});

2.自定义Comparator方法(老方法)

我这里写的时候是使用的匿名对象, 自己定义了一个Comparator, 用于比较String类型的比较器, 然后记得覆写Compare方法;

Collections.sort(Arrays.asList(s), new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o1.length()-o2.length();
    }
});

当然也可以这样写, 不用匿名函数比较繁琐一些:

Comparator<String> comp = new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o1.length()-o2.length();
    }
};
Collections.sort(Arrays.asList(s), comp);

3.传入比较参数

我也不知道这个应该叫什么, 语法上比较像方法引用或者lambda表达式, 其实和上面的第一种lambda表达式是一个意思;

Collections.sort(Arrays.asList(s), Comparator.comparingInt(String::length));
Collections.sort(Arrays.asList(s), Comparator.comparingInt(str->(str.length())));

不过这种方法似乎对于第二比较关键词就没法实现了, 所以还是得用前面两种方法;


最后, 所有的测试代码如下:
import java.util.*;

public class Test {
    public static void main(String[] args) {
        String[] s = {"GodV","mifengaaa","17shou","Aluka","Gucun","Cpt"};
        Collections.sort(Arrays.asList(s), Comparator.comparingInt(String::length));
        Collections.sort(Arrays.asList(s), Comparator.comparingInt(str->(str.length())));
        Collections.sort(Arrays.asList(s), (p,q)->{
            return Integer.valueOf(p.length()).compareTo(q.length());
        });
        Collections.sort(Arrays.asList(s), (p,q)->{
            return p.length()-q.length();
        });
        Collections.sort(Arrays.asList(s), new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.length()-o2.length();
            }
        });
        System.out.println();
        Arrays.stream(s).forEach(System.out::println);
    }
}

嘿嘿, 7911UUPUP!

Java8中排序算法比较器的三种写法(使用lambda表达式实现Comparator比较器)