2012-03-24 79 views
-2

我已經創建了一個類,其目標是擁有一個方法,在該類中接收一個字符串x,並且它的行程通過循環查看接收到的字符串是否與String []中的任何字符串匹配。這是我的代碼:輸入一個字符串,看看字符串是否與數組中的任何字符串匹配(JAVA)

public class MatchCountry 
{ 
    public boolean findCountry(String a) 
    { 
    boolean match = false; 
    String [] euCountries = {"Albania", "Andorra", "Armenia", "Austria", "Azerbaijan", "Belarus", "Belgium", "Bosnia and Herzegovina", 
     "Bulgaria", "Croatia", "Cyprus", "Czech Republic", "Denmark", "Estonia", "Finland", "France", "Georgia", "Germany", "Greece", 
     "Holland", "Iceland", "Ireland", "Italy", "Latvia", "Liechtenstein", "Lithuania", "Luxembourg", "Macedonia", "Malta", 
     "Moldova", "Monaco", "Montenegro", "Netherlands", "Norway", "Poland", "Portugal", "Romania","Russia","San Marino", 
     "Serbia", "Slovakia", "Slovenia", "Spain", "Sweden", "Switzerland", "Turkey", "Ukraine", "United Kingdom", "Vatican City"}; 
    int l = euCountries.length; 

    for (int i = 0; i < l; i++) 
    { 
     System.out.println(euCountries[i]); 
     if (a == euCountries[i]) 
     match = true; 
     else 
     match = false; 
    } 
    return match; 
    } 

    public static void main (String args[]) 
    { 
    MatchCountry mc = new MatchCountry(); 
    boolean found = mc.findCountry("Portugal"); 
    System.out.println(found); 
    } 
} 

不應該這樣做嗎?當我輸出布爾發現,它不斷給我假的... ...

回答

4

取而代之的是:

if (a == euCountries[i]) 
    match = true; 
    else 
    match = false; 

把這個:

if (a.equals(euCountries[i])) { 
    match = true; 
    } 

的問題與你的if是:

  • 你在做match = false當字符串不相等。這將重置以前找到的任何匹配項,除非您搜索的國家是您列表中的最後一個。
  • 應將字符串與.equals方法進行比較,否則您將比較字符串引用,而不是字符串本身。
+0

仍然不起作用:S – 2012-03-24 19:48:57

+0

對不起,它確實有效。非常感謝你,它是有道理的,它不起作用 – 2012-03-24 19:51:06

+0

很酷,很高興幫助! – 2012-03-24 19:51:54

2

Java字符串是參考類型,使用==進行比較可比較這些參考的值。除非兩個字符串是完全相同的對象,否則比較將返回false。

嘗試使用euCountries[i].equals(a)而不是a == euCountries[i]String.equals按價值而不是按參考值進行比較。 (由於使用.equals時出現一個錯誤,我反轉了比較:如果a爲空,則調用a.equals(anything)將拋出空指針異常。相反,您知道該字符串不爲空,而equals將返回false。)

你可以做的東西多一點效率說像

for (int i = 0; i < l; i++) { 
    if (euCountries[i].equals(a)) { 
     return true; 
    } 
} 
return false; 

通過這樣做,你,你已經找到了一個匹配,而不是通過整個陣列每一次循環,儘快退出。無論你做什麼,你一定會想要擺脫else { match = false; } - 它會給你陣列中的最後一個國家帶來麻煩。

此外,您可能會考慮使用HashSet而不是數組。通過哈希碼來檢查字符串是否在集合中比比較數組中的每個元素更有效。不過,如果你這樣做,你可能會希望它是靜態的,並且不在函數中。

0

試試這個:

for (int i = 0; i < l; i++) 
{ 
    if (a.equals(euCountries[i])) { 
     return true; 
    } 
} 
return false; 

這是更有效,因爲你找到一個匹配儘快退出。爲什麼繼續找?

這裏是另一回事嘗試可能更簡單:而不是存儲在陣列中的國家,把它們放在一個列表,並檢查它是這樣的:

return (euCountries.contains(a)); 
1

最好是使用一組實現例如HashSet的。 然而,即使有一個理由不使用套,你的代碼是遠遠沒有達到最佳

首先,把純粹的數據常量插入到類(靜態)

private static final String [] euCountries = {"Albania", "Andorra", "Armenia", "Austria", "Azerbaijan", "Belarus", "Belgium", "Bosnia and Herzegovina", 
    "Bulgaria", "Croatia", "Cyprus", "Czech Republic", "Denmark", "Estonia", "Finland", "France", "Georgia", "Germany", "Greece", 
    "Holland", "Iceland", "Ireland", "Italy", "Latvia", "Liechtenstein", "Lithuania", "Luxembourg", "Macedonia", "Malta", 
    "Moldova", "Monaco", "Montenegro", "Netherlands", "Norway", "Poland", "Portugal", "Romania","Russia","San Marino", 
    "Serbia", "Slovakia", "Slovenia", "Spain", "Sweden", "Switzerland", "Turkey", "Ukraine", "United Kingdom", "Vatican City"}; 

這個版本是更高效,沒有多餘的變種,因爲數據是有序的,你知道什麼時候停止

public boolean findCountry(String a) 
{ 
    for (String country : euCountries) { 
    int res = country.compareTo (a); // or use compareToIgnoreCase when more appropriate 
    if (res == 0) return true; 
    if (res > 0) return false; 
    } 
    return false; 
} 

下一個優化的步驟將是建立一個二進制搜索

1

若y我們的國家/地區代碼數組已妥善排序,爲什麼不使用java.lang.Arrays.binarySearch,這可以節省您不必自行循環的麻煩,並且是標準JRE的一部分?我在類似的情況下一直使用它。

相關問題