跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Java 数组,如何通过自定义实现倒叙排序?
未分類
2020 年 9 月 18 日

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

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

資深大佬 : LeeReamond 7

如题,初学 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)

  • 資深大佬 : EminemW

    应该是这样 (a,b) -> {b-a}

  • 資深大佬 : EminemW

    你看 Arrays.sort() 方法的参数就知道了,第二个参数是一个接口,这个接口要实现比较函数,这个函数返回值是一个整的。你写的 lambda 返回的是布尔型,当然不可以

  • 主 資深大佬 : LeeReamond

    @EminemW 还是报错
    ![]( Java 数组,如何通过自定义实现倒叙排序?)

  • 資深大佬 : Cbdy

    (a,b) -> b-a

  • 主 資深大佬 : LeeReamond

    @Cbdy 报错,报错信息相同

  • 資深大佬 : KaraSalmon

    数组用 Integer

  • 資深大佬 : aguesuka

    这个很明显是因为 int 是基本类型不是对象,比较函数的参数是泛型对象。

  • 資深大佬 : lxychn

    1. Arrays.sort() 不能应用于原始类型排序,int 是原始类型,String 不是
    2. Arrays.sort()第二个参数传入是个 Comparator,用的是里面才 compare 方法,compare 方法返回的是 int,一般用负值,0,正值代表小于,等于,大于。compareTo()返回的也是 int

  • 資深大佬 : black11black

    @aguesuka
    @lxychn
    感谢回复,Arrays.sort 如果不加 comparator 的话是可以对 int[]进行排序的,所以应该不是无法排序,所以原因应该是 comparator 无法应用于单纯 int 构成的数组?

  • 資深大佬 : ky11223344

    编译时静态检查不通过,这里的 sort 是个泛型方法,编译器无法通过输入参数推出类型参数的值,如果尝试指明类型参数再 call 这个方法会得到更明确的错误提示,像 Arrays.<int>sort 会提示 primitive 不能作为类型参数,或 Arrays.<Integer>sort 会提示第一个参数类型 int[]不正确。不指明类型参数的话则类型参数 T 无法被推导,在 lambda 里调用 a – b 则编译器认为对两个未知的 T 类型值做只有 primitive 才有效的加减乘除等操作是无效的,所以就有那个错误提示。这里还有个问题就是输入参数的类型不匹配任何一个 sort 方法函数签名时,编译器是怎么知道你要调用的就是这个泛型方法

  • 資深大佬 : vicsun2020

    Comparator 只接受包装类的比较,只用基础类型没法自定义排序

  • 資深大佬 : lxychn

    @black11black
    只考虑了这种特定情况。。是的,Arrays.sort()不加 Comparator 可以对 int[]递增排序,无法自定义排序。compare 和 compareTo 传入的是类。

  • 資深大佬 : daozhihun

    1. 如果你不传 comparator,就是正序排列,如果是基本类型就是基本类型的比较器,如果是引用类型会自动调用 compareTo 方法去比较
    2. 传入 comparator 才能实现你自己想要的排序方式,比如逆序或者其他的。
    但是 comparator 这个重载方法的定义是 T[],你这个 int[]是基本类型的数组,无法转换成 Object[]
    所以要么你自己把 int[]包装成 Integer[](用 stream ),要么你自己把数组反序。
    没错,这就是 java 这个泛型蛋疼的地方

  • 資深大佬 : Mysqto

    报错的原因是 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

    Arrays.stream(ns).boxed().sorted(Comparator.reverseOrder());

  • 資深大佬 : xhq

    使用 Guava
    Ints.sortDescending(new int[]{1, 2, 3, 4});

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具