Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 找不到适合排序的方法(int[],<;匿名比较器<;Integer>;)_Java_Arrays_Algorithm_Sorting - Fatal编程技术网

Java 找不到适合排序的方法(int[],<;匿名比较器<;Integer>;)

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

算法问题:给定一个非负整数列表,将它们排列成最大数

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

注意:结果可能非常大,因此需要返回字符串而不是整数

    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
时会出现异常。比较器仅与
对象
一起工作,而不与
原语
一起工作