V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LeeReamond
V2EX  ›  Java

Java 数组,如何通过自定义实现倒叙排序?

  •  
  •   LeeReamond · 2020-09-10 22:44:11 +08:00 · 3512 次点击
    这是一个创建于 1569 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,初学 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.out.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));
        }
    }
    
    16 条回复    2020-09-11 10:41:16 +08:00
    EminemW
        1
    EminemW  
       2020-09-10 23:22:38 +08:00
    应该是这样 (a,b) -> {b-a}
    EminemW
        2
    EminemW  
       2020-09-10 23:26:09 +08:00
    你看 Arrays.sort() 方法的参数就知道了,第二个参数是一个接口,这个接口要实现比较函数,这个函数返回值是一个整的。你写的 lambda 返回的是布尔型,当然不可以
    LeeReamond
        3
    LeeReamond  
    OP
       2020-09-11 00:01:47 +08:00
    @EminemW 还是报错
    ![]( )
    Cbdy
        4
    Cbdy  
       2020-09-11 00:16:42 +08:00 via Android
    (a,b) -> b-a
    LeeReamond
        5
    LeeReamond  
    OP
       2020-09-11 00:27:19 +08:00
    @Cbdy 报错,报错信息相同
    KaraSalmon
        6
    KaraSalmon  
       2020-09-11 01:22:52 +08:00
    数组用 Integer
    aguesuka
        7
    aguesuka  
       2020-09-11 01:35:01 +08:00 via Android
    这个很明显是因为 int 是基本类型不是对象,比较函数的参数是泛型对象。
    lxychn
        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
    black11black
        9
    black11black  
       2020-09-11 01:48:19 +08:00
    @aguesuka
    @lxychn
    感谢回复,Arrays.sort 如果不加 comparator 的话是可以对 int[]进行排序的,所以应该不是无法排序,所以原因应该是 comparator 无法应用于单纯 int 构成的数组?
    ky11223344
        10
    ky11223344  
       2020-09-11 03:38:52 +08:00 via Android   ❤️ 1
    编译时静态检查不通过,这里的 sort 是个泛型方法,编译器无法通过输入参数推出类型参数的值,如果尝试指明类型参数再 call 这个方法会得到更明确的错误提示,像 Arrays.<int>sort 会提示 primitive 不能作为类型参数,或 Arrays.<Integer>sort 会提示第一个参数类型 int[]不正确。不指明类型参数的话则类型参数 T 无法被推导,在 lambda 里调用 a - b 则编译器认为对两个未知的 T 类型值做只有 primitive 才有效的加减乘除等操作是无效的,所以就有那个错误提示。这里还有个问题就是输入参数的类型不匹配任何一个 sort 方法函数签名时,编译器是怎么知道你要调用的就是这个泛型方法
    vicsun2020
        11
    vicsun2020  
       2020-09-11 03:43:17 +08:00 via iPhone
    Comparator 只接受包装类的比较,只用基础类型没法自定义排序
    lxychn
        12
    lxychn  
       2020-09-11 06:22:26 +08:00
    @black11black
    只考虑了这种特定情况。。是的,Arrays.sort()不加 Comparator 可以对 int[]递增排序,无法自定义排序。compare 和 compareTo 传入的是类。
    daozhihun
        13
    daozhihun  
       2020-09-11 07:27:16 +08:00
    1. 如果你不传 comparator,就是正序排列,如果是基本类型就是基本类型的比较器,如果是引用类型会自动调用 compareTo 方法去比较
    2. 传入 comparator 才能实现你自己想要的排序方式,比如逆序或者其他的。
    但是 comparator 这个重载方法的定义是 T[],你这个 int[]是基本类型的数组,无法转换成 Object[]
    所以要么你自己把 int[]包装成 Integer[](用 stream ),要么你自己把数组反序。
    没错,这就是 java 这个泛型蛋疼的地方
    Mysqto
        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());`
    340244120w
        15
    340244120w  
       2020-09-11 09:34:07 +08:00
    Arrays.stream(ns).boxed().sorted(Comparator.reverseOrder());
    xhq
        16
    xhq  
       2020-09-11 10:41:16 +08:00
    使用 Guava
    Ints.sortDescending(new int[]{1, 2, 3, 4});
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1209 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:04 · PVG 02:04 · LAX 10:04 · JFK 13:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.