2017-05-08 37 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; 
    } 
} 

這些是我得到的例外。

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方法返回false 所有的時間,因爲你比較類型StringBuilder和類型StringString#equals因此什麼將被添加到ArrayList,這意味着String#equals不僅比較被比較的對象的內容,但也它們的類型,這就是問題出現時,被比較的對象可能具有相同的內容由於這樣的事實,一個是一個類型String,另一個是StringBuilder,T型的他if條件將總是導致錯誤。

克服此問題的解決方案是使用String#contentEquals,它不進行類型檢查,或在比較之前將StringBuilder轉換爲String類型。

選項1 -

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

選項2 -

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

其實,如果你正在使用現代IDE的一個,你應該有你的比較對象不可兌換的警告類型。您應該考慮使用IDE(如IntelliJ IDEA)來防止將來發生錯誤。

+0

謝謝您的回答我的問題。爲我解決了這個問題。 通常情況下,我使用Eclipse,但目前,我試圖讓熟悉Visual Studio代碼。 – jeremypuchta

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

您比較一個String newNStringBuilder sBuilder。 你必須到StringBuilder首先轉換爲字符串,否則將永遠不會被視爲相等:

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

如果你要重構'如果else',你不妨去儘可能'回報newN.equals(sBuilder.reverse()的toString();':) – Michael