Java 找不到适合排序的方法(int[],<;匿名比较器<;Integer>;)
算法问题:给定一个非负整数列表,将它们排列成最大数 例如,给定[3,30,34,5,9],最大形成数为9534330 注意:结果可能非常大,因此需要返回字符串而不是整数Java 找不到适合排序的方法(int[],<;匿名比较器<;Integer>;),java,arrays,algorithm,sorting,Java,Arrays,Algorithm,Sorting,算法问题:给定一个非负整数列表,将它们排列成最大数 例如,给定[3,30,34,5,9],最大形成数为9534330 注意:结果可能非常大,因此需要返回字符串而不是整数 public class Solution { public String largestNumber(int[] num) { Arrays.sort(num, new java.util.Comparator<Integer>() { @Override
public class Solution {
public String largestNumber(int[] num) {
Arrays.sort(num, new java.util.Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
String s1 = String.valueOf(a), s2 = String.valueOf(b);
return Integer.parseInt(s1 + s2) - Integer.parseInt(s2 + s1);
}
});
StringBuilder builder = new StringBuilder();
for (int i = num.length - 1; i >= 0; i--) builder.append(num[i]);
return builder.toString();
}
}
公共类解决方案{
公共字符串最大数(int[]num){
sort(num,new java.util.Comparator(){
@凌驾
公共整数比较(整数a、整数b){
字符串s1=String.valueOf(a),s2=String.valueOf(b);
返回Integer.parseInt(s1+s2)-Integer.parseInt(s2+s1);
}
});
StringBuilder=新的StringBuilder();
对于(inti=num.length-1;i>=0;i--)builder.append(num[i]);
返回builder.toString();
}
}
结果:第3行:错误:未找到适合排序的方法(int[],)
有人知道如何修改它吗?谢谢
谢谢你的详细回答,我已经修改了我的代码
public String largestNumber(int[] num) {
int N = num.length;
String[] aux = new String[N];
for (int i = 0; i < N; i++) aux[i] = String.valueOf(num[i]); // int[] -> String[]
Arrays.sort(aux, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return (int) (Long.parseLong(a + b) - Long.parseLong(b + a)); // note the overflow of int, max + max
}
});
StringBuilder builder = new StringBuilder();
for (int i = N - 1; i >= 0; i--) builder.append(aux[i]);
int sub = 0;
for ( ; sub < builder.length() - 1 && builder.charAt(sub) == '0'; sub++);
return builder.substring(sub).toString();
}
公共字符串最大数(int[]num){
int N=num.length;
字符串[]aux=新字符串[N];
对于(int i=0;iString[]
Arrays.sort(aux,new Comparator(){
@凌驾
公共整数比较(字符串a、字符串b){
return(int)(Long.parseLong(a+b)-Long.parseLong(b+a));//注意int的溢出,max+max
}
});
StringBuilder=新的StringBuilder();
对于(inti=N-1;i>=0;i--)builder.append(aux[i]);
int sub=0;
对于(;sub
我仍在试图找到一种避免使用额外空间的方法。原因是
int
和Integer
是不同的类型int
是一个原语,Integer
是它的对象包装器<代码>比较器仅适用于对象;它不适用于基本体
将int
s放入一个Integer
s的容器中,比如一个ArrayList
,然后使用比较器解决问题
请注意,对于非常大的整数,您的方法可能会失败,因为将两个有效的int
s串联起来可能会产生一个太大的数字,使得int
无法容纳。您可以返回(s1+s2)。compareTo(s2+s1)
而不是用于词典比较,这与相同长度数字的数字比较相同。必须使用整数
Integer[] nums = new Integer[]{3, 30, 34, 5, 9};
public class Solution {
public String largestNumber(Integer[] num) {
Arrays.sort(num, new java.util.Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
String s1 = String.valueOf(a), s2 = String.valueOf(b);
return Integer.parseInt(s1 + s2) - Integer.parseInt(s2 + s1);
}
});
StringBuilder builder = new StringBuilder();
for (int i = num.length - 1; i >= 0; i--) builder.append(num[i]);
return builder.toString();
}
}
Integer[]nums=新的整数[]{3,30,34,5,9};
公共类解决方案{
公共字符串最大数(整数[]num){
sort(num,new java.util.Comparator(){
@凌驾
公共整数比较(整数a、整数b){
字符串s1=String.valueOf(a),s2=String.valueOf(b);
返回Integer.parseInt(s1+s2)-Integer.parseInt(s2+s1);
}
});
StringBuilder=新的StringBuilder();
对于(inti=num.length-1;i>=0;i--)builder.append(num[i]);
返回builder.toString();
}
}
确实应该这样做。或者使用整数数组。更有效的方法是:将整数的String.valueOf表示形式放在一个字符串数组中,这样可以避免每次都在比较器中执行String.valueOf,然后比较器就会变成一个比较器。请注意,OP的方法会因非常大的数字而中断。例如,如果传递[2000000000,1999999999]
,则当比较器尝试解析199999999200000000
时会出现异常。比较器仅与对象
一起工作,而不与原语
一起工作