我正在做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表达式问题吗?
答案 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());
}