繁体   English   中英

项目Euler#4 ArrayList不添加整数

[英]Project Euler #4 ArrayList doesn't add Integers

我正在尝试解决目前的一些Project Euler问题。 我无法弄清楚为什么ArrayList不添加整数。

import java.util.ArrayList;
import java.util.Collections;

public class largestPalindromeProduct {
    public static void main(String[] args) {
        ArrayList<Integer> largestPalindrome = new ArrayList<Integer>();

        for (int x = 999; x >= 100; x--) {
            for (int y = 999; y >= 100; y--) {
                int result = x * y;
                if(isPalindrome(result)) {
                    largestPalindrome.add(result);
                    break;
                    // System.out.println("Added Palindrome: " +result);
                }
            }
        }
        System.out.println(Collections.max(largestPalindrome));
    }

    public static boolean isPalindrome(int n) {
        String newN = Integer.toString(n);
        // System.out.println("newN =" +newN);
        StringBuilder sBuilder = new StringBuilder(newN);
        // System.out.println("sBuilder reverse = " +sBuilder.reverse());
        if (newN.equals(sBuilder.reverse())) {
        return true;
        } else return false;
    }
}  

这些是我得到的例外情况。

Exception in thread "main" java.util.NoSuchElementException
    at java.util.ArrayList$Itr.next(ArrayList.java:854)
    at java.util.Collections.max(Collections.java:669)
    at largestPalindromeProduct.main(largestPalindromeProduct.java:18)

isPalindrome因为你比较一种方法返回false 所有的时间StringBuilder和类型StringString#equals因此没有将被添加到ArrayList,这意味着String#equals不但被比较的对象的内容进行比较,但也就是它们的类型,这就是问题发生的地方,被比较的对象可能具有相同的内容但是由于一个是String类型而另一个是StringBuilder类型, if条件总是会导致false。

解决此问题的解决方案是使用不进行类型检查的String#contentEquals ,或者在比较之前将StringBuilder转换为String类型。

选项1 -

if (newN.contentEquals(sBuilder.reverse()))

选项2 -

if (newN.equals(sBuilder.reverse().toString()))

实际上,如果你使用的是现代IDE之一,你应该警告你要比较不可逆类型的对象。 您应该考虑使用诸如IntelliJ IDEA之类的IDE来防止将来出现错误。

String newN = Integer.toString(n);
StringBuilder sBuilder = new StringBuilder(newN);
if (newN.equals(sBuilder.reverse())) {
    return true;
} else {
  return false;
}

您正在将String newNStringBuilder sBuilder进行比较。 您必须首先将StringBuilder转换为String,否则它们将永远不会被视为相等:

if (newN.equals(sBuilder.reverse().toString())) {
    return true;
} else {
  return false;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM