概述
List的sort()方法通过改写compare()实现升序、降序
必须明确两点:
- compare(Integer e1, Integer e2){}返回的只有-1,0,1这些具体值,函数自己并不会对list进行排序。对list排序是因为有sort()对返回的值进行处理,规则为:1表示不交换位置,0表示相等时不交换,-1表示交换位置。
- compare(Integer e1, Integer e2){}中,e1代表的是List容器中的后一个元素,e2代表的是List容器中的前一个元素。
//实现Comparator进行降序排序
Collections.sort(list, new Comparator<Object>(){
@Override
public int compare(Object o1, Object o2) {
//升序排序 return ((Student) o1).getAge() - ((Student) o2).getAge();
return ((Student) o2).getAge() - ((Student) o1).getAge();
}
});
字符串的compareTo的用法:
- 返回参与比较的前后两个字符串的asc码的差值,如果两个字符串首字母不同,则该方法返回首字母的asc码的差值。
String a1 = "a";
String a2 = "c";
System.out.println(a1.compareTo(a2));//结果为-2
- 参与比较的两个字符串如果首字符相同,则比较下一个字符,直到有不同的为止,返回该不同的字符的asc码差值。
String a1 = "aa";
String a2 = "ad";
System.out.println(a1.compareTo(a2));//结果为-3
- 如果两个字符串不一样长,可以参与比较的字符又完全一样,则返回两个字符串的长度差值。
String a1 = "aa";
String a2 = "aa12345678";
System.out.println(a1.compareTo(a2));//结果为-8
- Integer比较用compareTo()时:返回为正数表示a1>a2, 返回为负数表示a1<a2, 返回为0表示a1==a2。
Integer x = 5;
System.out.println(x.compareTo(3)); //1
System.out.println(x.compareTo(5)); //0
System.out.println(x.compareTo(8)); //-1
实际应用:
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
解答:通过在排序时传入一个自定义的 Comparator 实现,重新定义 String 列表内的排序方法,若拼接 s1 + s2 > s2 + s1,那么显然应该把 s2 在拼接时放在前面,以此类推,将整个 String 列表排序后再拼接起来。
比较list中每两两元素的组合,组合得到的数越小,越是将其放在前面,代码如下:
//保证nums排序顺序为:s1s2 < s2s1
public String minNumber(int[] nums) {
List<String> list = new ArrayList<>(nums.length);
for (int e : nums) {
list.add(String.valueOf(e));
}
//s1+s2 < s2+s1, 则返回1
//1表示不交换位置,0表示相等时不交换,-1表示交换位置
list.sort((s1, s2) -> (s1 + s2).compareTo(s2 + s1));
StringBuilder result = new StringBuilder();
list.forEach(e -> result.append(e));
return result.toString();
}
我是pavel,一位憨憨傻傻的程序员,平时幽默又有才,专注于Java,go,微服务,云开发。不定时发送些腾讯程序员的工作/生活日常,请大家多多关注我的公众号!
最后
以上就是愤怒歌曲为你收集整理的比较器compareTo和compare()的lambda用法的全部内容,希望文章能够帮你解决比较器compareTo和compare()的lambda用法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复