在涉及到数组, 集合等这些地方经常会需要用到排序算法, 在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() {
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
});
当然也可以这样写, 不用匿名函数比较繁琐一些:
Comparator comp = new Comparator() {
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
};
Collections.sort(Arrays.asList(s), comp);
3.方法引用
使用方法引用, 传入String类的length方法, 其实和上面的第一种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() {
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
});
System.out.println();
Arrays.stream(s).forEach(System.out::println);
}
}
嘿嘿, 7911UUPUP!