【问题标题】:java: Arrays.sort() with lambda expressionjava: 带有 lambda 表达式的 Arrays.sort()
【发布时间】:2014-03-25 02:37:55
【问题描述】:

我想使用Arrays.sort 方法按长度对数组months 中的字符串元素进行排序。我被告知here,可以使用 lambda 表达式而不是创建实现 Comparator 的新类。完全一样的方法,但它不起作用。

import java.util.Arrays;
import java.util.Comparator;

public class MainClass {
public static void main(String[] args)
{

    String[] months = {"January","February","March","April","May","June","July","August","September","October","December"};

    System.out.println(Arrays.toString(months)); //printing before


    //neither this works:
    Arrays.sort(months, 
            (a, b) -> Integer.signum(a.length() - b.length())   
    );

    //nor this:
    Arrays.sort(months, 
            (String a, String b) -> { return Integer.signum(a.length() - b.length()) }; 
    );


    System.out.println(Arrays.toString(months)); //printing after
}
}

【问题讨论】:

  • “完全一样的方法,但它不起作用。”不,你没有,仔细阅读他们做了什么。您有语法错误。
  • @ZouZou 也许他做到了。我认为 OP 甚至没有使用 Java 8。

标签: java arrays sorting lambda java-8


【解决方案1】:

你正在寻找这个:

Arrays.sort(months, (a, b) -> Integer.signum(a.length() - b.length()));

【讨论】:

  • 为我工作...您确定您使用的是 Java 8 吗?您使用的是哪个 IDE?
  • @lavsprat 它也适用于我,它打印 [May, June, July, March, April, August, January, October, February, December, September]... 你使用的是什么 Java 8 版本?
  • 我正在使用 Eclipse。 This 网站说我有第 7 版更新 51。
  • 那么你当然不能使用 lambda,因为它们只在 Java 8 中可用。
【解决方案2】:

最干净的方法是:

Arrays.sort(months, Comparator.comparingInt(String::length));

或者,使用静态导入:

Arrays.sort(months, comparingInt(String::length));

但是,这也可以,但更冗长:

Arrays.sort(months,
            (String a, String b) -> a.length() - b.length());

或更短:

Arrays.sort(months, (a, b) -> a.length() - b.length());

最后一个:

Arrays.sort(months, 
    (String a, String b) -> { return Integer.signum(a.length() - b.length()) }; 
);

; 放错了位置 - 应该是:

Arrays.sort(months, 
    (String a, String b) -> { return Integer.signum(a.length() - b.length()); }
);

【讨论】:

  • +1 用于显示 Comparator.comparing,这比编写自定义 lambda 或 Comparator 更容易掌握。
  • 我建议使用Integer.compare 而不是- 的signum。
  • @PeterLawrey 确实 - signum(a-b) 有溢出的风险(即使字符串不太可能)。
  • @lavsprat 呵呵....版本 7 != 版本 8...Java 8 在这里:jdk8.java.net/download.html
  • 我认为- 在这种情况下不会溢出,因为这两个值都是非负数。
【解决方案3】:

您正在寻找的功能在尚未发布的 Java 8 中。如果您想等待,或者如果没有可用的测试版下载,它计划在几个月后发布。

【讨论】:

  • 有用的评论,但不是答案。
  • @TedHopp 这是一个答案。他的代码没有编译,因为他试图在 Java 7 中使用 Java 8 功能!
  • 他的代码没有编译,因为它有语法错误(Arrays.sort 的第二个参数末尾的分号)。
  • 这条评论有点误导,除非你把三周算作“几个月”:发货日期是3月18日
猜你喜欢
  • 2013-07-02
  • 2020-10-06
  • 2016-07-27
  • 2014-08-17
  • 2017-06-02
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多