如何使用lambda表达式来调用比较器?

时间:2015-06-16 04:04:29

标签: java lambda java-8

我正在做leetcode的最大数字问题。这是问题所在:

给定一个非负整数列表,将它们排列成最大数字。

例如,给定[3,30,34,5,9],最大形成数为9534330。

并且有5行C#代码:

internal static string LargestNumber(List<int> vals)
    {
        if(vals==null || vals.Count==0)
            return "";
        vals.Sort((a,b)=>String.Compare(b+""+a,a+""+b));
        return vals[0]==0?"0":String.Join("",vals);
    }

它使用lambda表达式。 但是当我尝试编写java代码时:

public String largestNumber(int[] num) {
  String[] sNum = new String[num.length];
    for(int i = 0;i<num.length; i++){
        sNum[i] = Integer.toString(num[i]);
    }
    Collections.sort(sNum,(String n1,String n2) -> (n1 + n2).compareTo(n2 + n1));
    String s = sNum[0];
    for(int i = 1;i<sNum.length;i++)
        s += sNum[i];
    if(s.charAt(0) == '0')
        s = "0";
    return s;
}

报告错误: 此行有多个标记      - 类型不匹配:无法从比较器转换为比较器      - 类型集合中的方法sort(List,Comparator)不适用于      arguments(String [],(String n1,String n2) - &gt; {})

任何人都可以帮我解决java中的这个lambda表达式问题吗?

5 个答案:

答案 0 :(得分:1)

在Java中,如果没有显式转换,则无法将int排序为String,但是,仍然可以在一次操作中执行此操作:

public String largestNumber(int[] num) {
    String s=Arrays.stream(num).mapToObj(Integer::toString)
                   .sorted((n1, n2) -> (n2+n1).compareTo(n1+n2))
                   .collect(Collectors.joining());
    return s.charAt(0) == '0'? "0": s;
}

答案 1 :(得分:0)

排序数组而不是集合

    public String largestNumber(int[] num) {

      String[] sNum = new String[num.length];

        for(int i = 0;i<num.length; i++){
            sNum[i] = Integer.toString(num[i]);
        }
        Arrays.sort(sNum,(n1, n2) -> (n1 + n2).compareTo(n2 + n1));
        String s = sNum[0];
        for(int i = 1;i<sNum.length;i++)
            s += sNum[i];
        if(s.charAt(0) == '0')
            s = "0";
        return s;
    }

答案 2 :(得分:0)

    Arrays.sort(sNum, (a,b)-> (b+a).compareTo(a+b));

    return String.join("", sNum);

答案 3 :(得分:0)

使用 Java 8 你可以(几乎)做同样的事情:

public static void largestNumber(int[] nums) {
    // move int[] to Object[]
    Object[] arr = Arrays.stream(nums)
                            .mapToObj(x -> Integer.toString(x))
                            .toArray();

    //sort by dictionary order
    Arrays.sort(arr);

    // reverse from ascending to descending order
    Collections.reverse(Arrays.asList(arr));

    // back to String and print
    System.out.println(Arrays.stream(arr)
                                .reduce((x, y) -> x.toString() + y.toString())
                                .get());
}

那就是说,我上面的评论仍然存在:

  

字符串顺序(字典顺序)在这里不会帮助你,因为它会   返回[9,5,34,30,3]而你想要的是:[9,5,34,3,30]

答案 4 :(得分:0)

如果String#compareTo适合您,那么您可以真正简化一些事情,并使用单个Stream链进行操作:

public static String largestNumber(int[] nums) {
    return IntStream.of(nums)
                .mapToObj(Integer::toString)
                .sorted((a, b) -> b.compareTo(a))
                .collect(Collectors.joining());
}