我目前正在尝试解决一些 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 all 因为您正在比较类型 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 之一,您应该会收到一条警告,提示您正在比较不可转换类型的对象。您应该考虑使用 IDE(例如 IntelliJ IDEA)来防止将来出现此类错误。
关于java - Project Euler #4 ArrayList 不添加整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43852579/