输入一个String,看看String是否与数组中的任何字符串匹配(JAVA)

时间:2012-03-24 19:44:30

标签: java arrays string for-loop boolean

我创建了一个类,其目标是在该类中接收一个String x,然后通过循环查看接收到的字符串是否与String []中的任何字符串匹配。这是我的代码:

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);
  }
}

不应该这样吗?当我输出boolean found时,它一直给我FALSE ...

5 个答案:

答案 0 :(得分:4)

而不是:

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

把这个:

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

if的问题是:

  • 当字符串不相等时,你正在match = false。这将重置之前找到的所有匹配项,除非您要搜索的国家/地区是列表中的最后一个
  • 字符串应与.equals方法进行比较,否则您要比较字符串引用,而不是字符串本身。

答案 1 :(得分:2)

Java字符串是引用类型,使用==进行比较会比较这些引用的值。除非两个字符串完全相同的对象,否则比较将返回false。

尝试使用euCountries[i].equals(a)而不是a == euCountries[i]String.equals按值而不是按引用进行比较。 (由于使用.equals的一个缺陷,我推翻了比较:如果a为null,则调用a.equals(anything)将抛出空指针异常。反过来,你知道string不为null,equals将返回false。)

你可以通过说

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

通过这样做,您在找到匹配后立即退出,而不是每次都循环遍历整个数组。你绝对想要摆脱else { match = false; }无论你做什么,它都会给阵容中的最后一个国家带来麻烦。

此外,您可以考虑使用HashSet而不是数组。检查字符串是否在哈希代码集合中比比较数组中的每个元素要高效得多。但是,如果你这样做,你可能希望它在函数之外是静态的。

答案 2 :(得分: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"};

这个版本效率更高,没有额外的var,因为数据是有序的,你知道何时停止

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;
}

下一步优化步骤是构建二进制搜索

答案 3 :(得分:1)

如果您的国家/地区代码数组已正确排序,为什么不使用java.lang.Arrays.binarySearch,这样可以省去自己循环的麻烦,并且是标准JRE的一部分?我在类似情况下一直使用它。

答案 4 :(得分:0)

试试这个:

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

找到匹配后立即退出会更有效率。为什么一直在寻找?

尝试另一件事可能会使其更简单:不是将国家/地区存储在数组中,而是将它们放在List中并以这种方式检查:

return (euCountries.contains(a));