为什么这个java字符串例程不打印答案?

0 java string

我一直在研究Project Euler问题4.我是java的新手,并且相信我找到了答案(906609 = 993*913,使用Excel!).

当我打印出注释掉的那一行时,我可以说我的字符串操作有效.我已经研究了一些比较字符串的方法,以防我没有多少东西,但这个例程并没有给我一个结果.

请帮我确定一下为什么不打印答案?

詹姆士

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

    int i;
    int j;
    long k;
    String stringProd;

    for(i=994;i>992; i--){
        for (j=914;j>912; j--){
            k=(i*j);
            stringProd=String.valueOf(k);
            int len=stringProd.length();

            char[] forwards=new char[len];
            char[] back = new char[len];

            for(int l=0; l<len; l++){
                forwards[l]=stringProd.charAt(l);
            }

            for(int m=0; m<len;m++){
                back[m]=forwards[len-1-m];

            } 

            //System.out.println(forwards);
            //System.out.println(back);

            if(forwards.toString().equals(back.toString())){
                System.out.println(k);}
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Roh*_*ain 8

您正在比较数组的字符串表示形式.toString()没有给你你的想法.例如,下面的代码清楚地表明:

char[] arr1 = {'a', 'b'};
char[] arr2 = {'a', 'b'};

System.out.println(arr1.toString() + " : " + arr2.toString());
Run Code Online (Sandbox Code Playgroud)

此代码打印:

[C@16f0472 : [C@18d107f
Run Code Online (Sandbox Code Playgroud)

因此,即使内容相等,两个数组的字符串表示也是不同的.这是因为数组不会覆盖toString()方法.它继承了该Object#toString()方法.

toString类的方法Object返回一个字符串,该字符串由对象为实例的类的名称,at符号字符@和对象的哈希码的无符号十六进制表示组成.换句话说,此方法返回一个等于值的字符串:

getClass().getName() + '@' + Integer.toHexString(hashCode())
Run Code Online (Sandbox Code Playgroud)

因此,在上面的输出中,[C是输出char[].class.getName(),并且18d107f是哈希码.

您也不能比较使用的数组forward.equals(back),因为Java中的数组不会覆盖equals()或者hashCode()两者之一.任何选择?是的,为了比较数组,您可以使用Arrays#equals(char[], char[])方法:

if (Arrays.equals(forward, back)) {
    System.out.println(k);
}
Run Code Online (Sandbox Code Playgroud)

另外,要获得char数组,您不需要这些循环.你可以使用String#toCharArray()方法.而且为了得到String的反转,你可以将字符串包装在一个StringBuilder实例中,并使用它的reverse()方法:

char[] forwards = stringProd.toCharArray();
char[] back = new StringBuilder(stringPod).reverse().toString().toCharArray();
Run Code Online (Sandbox Code Playgroud)

现在您已经找到了一种简单的方法来反转字符串,那么如何String#equals()直接使用方法,并且无法创建这些字符数组呢?

String stringPod = String.valueOf(k);
String reverseStringPod = new StringBuilder(stringPod).reverse().toString()

if (stringPod.equals(reverseStringPod)) {
    System.out.println(k);
}
Run Code Online (Sandbox Code Playgroud)

最后,因为它是关于项目的欧拉,这是关于速度和大多数数学.您应该考虑避免使用String实用程序,并使用常规除法和模数运算来获取每个数字,从开始和结束,并比较它们.