【问题标题】:Enter a String and see if the String matches with the any of the Strings in an array (JAVA) [closed]输入一个字符串并查看该字符串是否与数组中的任何字符串匹配(JAVA)[关闭]
【发布时间】:2012-04-08 22:36:01
【问题描述】:

我创建了一个类,其目标是在该类中接收一个字符串 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);
  }
}

这不应该吗?当我输出找到的布尔值时,它一直给我 FALSE ...

【问题讨论】:

    标签: java arrays string for-loop boolean


    【解决方案1】:

    最好使用集合实现,例如哈希集。 但是,即使有理由不使用集合,您的代码也远非最佳

    首先将纯常量数据放入类中(静态)

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

    下一个优化步骤是构建二分搜索

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        尝试使用euCountries[i].equals(a) 而不是a == euCountries[i]String.equals 按值而不是按引用进行比较。 (我颠倒了比较,因为使用.equals 的一个陷阱:如果a 为空,那么调用a.equals(anything) 将引发空指针异常。反过来,你知道字符串不为空,并且@ 987654328@ 将返回 false。)

        你可以说喜欢让事情变得更有效率

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

        通过这样做,您会在找到匹配项后立即退出,而不是每次都遍历整个数组。不管你做什么,你肯定都想摆脱else { match = false; }——它会给你数组中的最后一个国家之外的任何国家带来麻烦。

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

        【讨论】:

          【解决方案4】:

          试试这个:

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

          找到匹配项后立即退出会更有效率。为什么要继续寻找?

          这里有另一件事可以尝试,它可能会更简单:不是将国家存储在一个数组中,而是将它们放在一个列表中并以这种方式检查:

          return (euCountries.contains(a));
          

          【讨论】:

            【解决方案5】:

            而不是这个:

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

            这样写:

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

            您的if 的问题是:

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

            【讨论】:

            • 抱歉,它确实有效。非常感谢,它不起作用是有道理的
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-16
            • 2023-01-30
            • 2022-01-08
            • 2013-12-04
            • 1970-01-01
            相关资源
            最近更新 更多