
如题,初学 java,熟悉语法过程中遇到问题,代码段如下
import java.util.Arrays; public class Main { public static void main(String[] args) { int[] ns = {5,4,3,2,1}; Arrays.sort(ns , (a,b) -> a>=b); System.ou.println(Arrays.toString(ns)); } } 希望实现的效果:正序排序与倒叙排序。
按照其他语言的逻辑,给定的 sort 函数一般是用快排之类的算法,这种情况下如果要实现倒叙排序的话,一般是在后面输入一个自定义判断函数,用作判断大小。
然后在这段代码里这个排序函数就应该是看起来很像 js 的箭头函数的这个[(a,b) -> a>=b ]
代码无法运行,报错[运算符 '>=' 不能应用于 'T', 'T']。无法理解发生了什么,不理解为什么无法执行。另外关于这个类似箭头函数的,应该是 java 的 lambda 函数吧,不定义输入类型什么的真的没有搞错吗?
=========================================================
上文是整数排序,换成字符串的话就可以运行了,不理解为什么
import java.util.Arrays; public class Main { public static void main(String[] args) { String[] ns = {"5","4","3","2","1"}; Arrays.sort(ns , (a,b) -> a.compareTo(b)); // 为什么用大于判断不行,用 string 的方法判断就行了 System.out.println(Arrays.toString(ns)); } } 1 EminemW 2020-09-10 23:22:38 +08:00 应该是这样 (a,b) -> {b-a} |
2 EminemW 2020-09-10 23:26:09 +08:00 你看 Arrays.sort() 方法的参数就知道了,第二个参数是一个接口,这个接口要实现比较函数,这个函数返回值是一个整的。你写的 lambda 返回的是布尔型,当然不可以 |
3 LeeReamond OP |
4 Cbdy 2020-09-11 00:16:42 +08:00 via Android (a,b) -> b-a |
5 LeeReamond OP @Cbdy 报错,报错信息相同 |
6 KaraSalmon 2020-09-11 01:22:52 +08:00 数组用 Integer |
7 aguesuka 2020-09-11 01:35:01 +08:00 via Android 这个很明显是因为 int 是基本类型不是对象,比较函数的参数是泛型对象。 |
8 lxychn 2020-09-11 01:45:26 +08:00 1. Arrays.sort() 不能应用于原始类型排序,int 是原始类型,String 不是 2. Arrays.sort()第二个参数传入是个 Comparator,用的是里面才 compare 方法,compare 方法返回的是 int,一般用负值,0,正值代表小于,等于,大于。compareTo()返回的也是 int |
9 black11black 2020-09-11 01:48:19 +08:00 |
10 ky11223344 2020-09-11 03:38:52 +08:00 via Android 编译时静态检查不通过,这里的 sort 是个泛型方法,编译器无法通过输入参数推出类型参数的值,如果尝试指明类型参数再 call 这个方法会得到更明确的错误提示,像 Arrays.<int>sort 会提示 primitive 不能作为类型参数,或 Arrays.<Integer>sort 会提示第一个参数类型 int[]不正确。不指明类型参数的话则类型参数 T 无法被推导,在 lambda 里调用 a - b 则编译器认为对两个未知的 T 类型值做只有 primitive 才有效的加减乘除等操作是无效的,所以就有那个错误提示。这里还有个问题就是输入参数的类型不匹配任何一个 sort 方法函数签名时,编译器是怎么知道你要调用的就是这个泛型方法 |
11 vicsun2020 2020-09-11 03:43:17 +08:00 via iPhone Comparator 只接受包装类的比较,只用基础类型没法自定义排序 |
12 lxychn 2020-09-11 06:22:26 +08:00 @black11black 只考虑了这种特定情况。。是的,Arrays.sort()不加 Comparator 可以对 int[]递增排序,无法自定义排序。compare 和 compareTo 传入的是类。 |
13 daozhihun 2020-09-11 07:27:16 +08:00 1. 如果你不传 comparator,就是正序排列,如果是基本类型就是基本类型的比较器,如果是引用类型会自动调用 compareTo 方法去比较 2. 传入 comparator 才能实现你自己想要的排序方式,比如逆序或者其他的。 但是 comparator 这个重载方法的定义是 T[],你这个 int[]是基本类型的数组,无法转换成 Object[] 所以要么你自己把 int[]包装成 Integer[](用 stream ),要么你自己把数组反序。 没错,这就是 java 这个泛型蛋疼的地方 |
14 Mysqto 2020-09-11 08:30:31 +08:00 报错的原因是 Arrays.sort()不支持 primitive type, 你把 int 换成 Integer, 顺序倒叙都可以用 lambda ```java Integer[] ns = {5,4,3,2,1}; Arrays.sort(ns , (a,b) -> b-a); ``` ```java Integer[] ns = {5,4,3,2,1}; Arrays.sort(ns , (a,b) -> a-b); ``` 当然最简单的你想倒叙可以用 `Arrays.sort(ns , Comparator.reverseOrder());` |
15 340244120w 2020-09-11 09:34:07 +08:00 Arrays.stream(ns).boxed().sorted(Comparator.reverseOrder()); |
16 xhq 2020-09-11 10:41:16 +08:00 使用 Guava Ints.sortDescending(new int[]{1, 2, 3, 4}); |