[英]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
和类型String
与String#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 newN
与StringBuilder sBuilder
进行比较。 您必须首先将StringBuilder转换为String,否则它们将永远不会被视为相等:
if (newN.equals(sBuilder.reverse().toString())) {
return true;
} else {
return false;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.