2017-05-08 5 views
0

私はいくつかのプロジェクトオイラーの問題を現在解決しようとしています。なぜArrayListが整数を追加しないのか分かりません。プロジェクトオイラー#4 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; 
    } 
} 

これは例外です。あなたがタイプStringBuilderとは、ArrayListに追加されますString#equalsので、何もタイプStringを比較しているので、

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) 

答えて

3

あなたisPalindrome方法はString#equalsがないだけで比較していることを意味し、偽すべて時間を返しています比較されるオブジェクトの内容だけでなく、そのタイプも問題が発生した場所です。比較されるオブジェクトは、StringタイプとStringBuilderタイプのため、同じ内容の,を持つ可能性があります彼if条件常に falseになります。

この問題を解決するソリューションは、タイプチェックを行わないString#contentEqualsを使用するか、またはStringを比較する前にStringBuilderに変換することです。

オプション1 -

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

オプション2 - あなたは、現代のIDEののいずれかを使用している場合

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

実際には、あなたがinconvertibleのオブジェクトを比較している警告を持っている必要がありますタイプ。将来IntelliJ IDEAなどのIDEを使用してエラーを回避することを検討する必要があります。

+0

おかげで、私の質問へのあなたの親切な返事を。私の問題を解決しました。 通常、私はEclipseを使用していますが、現在はVisual Studio Codeに慣れようとしています。 – jeremypuchta

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

あなたはStringBuilder sBuilderからString newNを比較しています。 あなたが最初の文字列にStringBuilderのを変換する必要があり、またはそれらが等しいと見なされることはありません。

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

もし 'if else'をリファクタリングするつもりならば' return newN.equals(sBuilder.reverse()。toString(); ')まで行くことができます。 – Michael

関連する問題