2012-03-24 78 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的一部分?我在类似的情况下一直使用它。

相关问题