【问题标题】:Using a method to search a match in a list in Java使用方法在 Java 列表中搜索匹配项
【发布时间】:2012-10-07 08:45:08
【问题描述】:

我正在尝试创建一个程序,该程序将使用名为“防弹”的包(完成,工作正常)从用户那里获取输入,但是当我找到匹配项时出现无限循环错误。我有点不知所措,我觉得我不太理解我的代码为什么不起作用。我不是在寻找直接的答案,因为我正在努力学习这一点,但任何帮助都将不胜感激。谢谢,我的代码如下。

--编辑-- 我得到了程序的工作。谢谢大家的帮助,你们太棒了。

import bulletproof.*;

public class A26_1 {
public static void main(String[] args) {
    BPScanner kb = new BPScanner();
    String reservedWordToCheck = kb.getStringFromUser("Enter a word to see if it's reserved or enter leave: ");

    System.out.println(ReservedWordChecker(reservedWordToCheck));
}

public static String ReservedWordChecker(String reservedWordToCheck) {
    String[] table = {
            "abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const",
            "continue", "default", "do", "double", "enum", "extends", "final", "finally", "float",
            "for", "goto", "if", "implements", "import", "instanceof", "int", "interface", "long", "native",
            "new", "package", "private", "protected", "public", "return", "short", "static", "strictfp", "super",
            "switch", "synchronized", "this", "throw", "throws", "transient", "try", "void", "volatile", "while"
        };

    while (true) {                      
        if (reservedWordToCheck.equalsIgnoreCase("leave"))
            break;                
        boolean found = false;

        for (int i=0; i < table.length; i++) {
            if (reservedWordToCheck.equalsIgnoreCase(table[i])) {
                found = true;
                break;
            }               
            if (found)
                System.out.println("Yeah, " + reservedWordToCheck + ", is reserved as a Java identifier.");
            else
                System.out.println("Nope, the word " + reservedWordToCheck + ", isn't reserved. Go hog wild.");                      
        }      
        System.out.println("OK BYE");
    } return reservedWordToCheck;
}  

}

【问题讨论】:

  • 一般输入法?就像我在该列表中输入一个单词,它应该匹配并说“是的”,然后单词“,是保留字。”。程序检查方法内部提供的列表。我希望能澄清一些事情。
  • 您好,一个好的做法是使用如下所示的字符串相等函数:if ("leave".equalsIgnoreCase(reservedWordToCheck))。这样做可以防止发生 NullPointerException。如果 reservedWordToCheck 为空,则条件为假,正如我们所料,但避免了 RuntimeException。
  • 你还应该考虑修改你的代码只有一个循环,你不需要外部的while。 if (table[i].equalsIgnoreCase(reservedWordToCheck)) { return reservedWordToCheck;} 之前的 if 和最后你可以简化你的代码。还要记住在您的方法之外将 String [] 表声明为常量,每次使用 ReservedWordChecker 时都创建一个新实例是不可取的。我还认为该方法应该被称为 existsReservedWord 并且可以返回一个布尔值,而不是您正在搜索的单词。

标签: java string list methods


【解决方案1】:

for 循环中的break 打破了for 循环而不是while。因此,while 循环将无限继续。

查看更改,我已经完成,它应该可以正常工作。

while (true) 
{
    .......
    .......

for (int i=0; i < table.length; i++) 
{                
    if (reservedWordToCheck.equalsIgnoreCase(table[i])) 
    {                    
        found = true; 
        break; // remove break from here          
    }

    if (found)                    
    {
        System.out.println("Yeah, " + reservedWordToCheck + ", is reserved as a Java identifier.");
        break;
    }                                  
} // end for
if(found)
{
    System.out.println("OK BYE");
}
else                    
{
    System.out.println("Nope, the word " + reservedWordToCheck + ", isn't reserved. Go hog wild.");
}
break;
} // end while

但是,您不需要 while(true) 构造来检查这一点。只有for 就足够了。

【讨论】:

    【解决方案2】:

    那是因为您的未标记 break 仅完成 for 语句,但 while(true) 将继续迭代。

    解决方案可以使用如下标记的中断:

      search: 
      while (true) {                      
            if (reservedWordToCheck.equalsIgnoreCase("leave"))           
               break;                
            boolean found = false;
    
            for (int i=0; i < table.length; i++) {
                if (reservedWordToCheck.equalsIgnoreCase(table[i])) {
                    found = true;
                    break search;
                }               
                if (found)
                    System.out.println("Yeah, " + reservedWordToCheck + ", is reserved as a Java identifier.");
                else
                    System.out.println("Nope, the word " + reservedWordToCheck + ", isn't reserved. Go hog wild.");                      
            }      
            System.out.println("OK BYE");
        } return reservedWordToCheck;
    

    更多信息请阅读:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html

    【讨论】:

      【解决方案3】:

      你没有在正确的位置打破:

      for (int i=0; i < table.length; i++) {
          if (reservedWordToCheck.equalsIgnoreCase(table[i])) {
              found = true;
              break; <--
          }               
          if (found)
              System.out.println("Yeah, " + reservedWordToCheck + ", is reserved as a Java identifier.");
          else
              System.out.println("Nope, the word " + reservedWordToCheck + ", isn't reserved. Go hog wild.");                      
      }
      

      找到该单词后,您会跳出 for 循环,除了 OK BYE 之外什么都不显示。

      我不明白你为什么在那里放一个无限循环?

      类似的东西会起作用:

      public static String ReservedWordChecker(String reservedWordToCheck) {
          String[] table = { ... };
      
          if (reservedWordToCheck.equalsIgnoreCase("leave")) {
              break;
          }
      
          boolean found = false;
          for (String entry : table) {
              if (entry.equalsIgnoreCase(reservedWordToCheck)) {
                  found = true;
                  break;
              }
          }
      
          if (found) {
              System.out.println("Yeah, " + reservedWordToCheck + ", is reserved as a Java identifier.");
          } else {
              System.out.println("Nope, the word " + reservedWordToCheck + ", isn't reserved. Go hog wild.");                      
          }
          System.out.println("OK BYE");
          return reservedWordToCheck;
      }
      

      }

      【讨论】:

        【解决方案4】:

        找到匹配项后,您并没有退出 while 循环:-

        您应该将您的if-else 移出您的for-loop 并在您的if 中添加中断,这将中断您的while,无论是否找到匹配项:-

        for (int i=0; i < table.length; i++) {
            if (reservedWordToCheck.equalsIgnoreCase(table[i])) {
                found = true;
                break;
            }
        } 
        if (found) {
             System.out.println("Yeah, " + reservedWordToCheck + 
                                ", is reserved as a Java identifier.");
             break;
        } else {
             System.out.println("Nope, the word " + reservedWordToCheck + 
                                ", isn't reserved);
             break;
        }
        

        但我不明白,为什么你需要一个while 循环。它有点毫无意义。你的for-loop 足以做你想做的事。

        【讨论】:

          【解决方案5】:

          我认为最简单的方法是 -

          public static boolean ReservedWordChecker(String reservedWordToCheck) {
              String[] table = {
                      "abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const",
                      "continue", "default", "do", "double", "enum", "extends", "final", "finally", "float",
                      "for", "goto", "if", "implements", "import", "instanceof", "int", "interface", "long", "native",
                      "new", "package", "private", "protected", "public", "return", "short", "static", "strictfp", "super",
                      "switch", "synchronized", "this", "throw", "throws", "transient", "try", "void", "volatile", "while"
                  };
          
                 for (String data : table) {
                      if (reservedWordToCheck.equalsIgnoreCase(data)) {
                          return true;
                      }
                  }
                return false;
          }  
          

          【讨论】:

          • 哇,我听说我可以将它转换为布尔值,但我没想到会这么简单。这对我帮助很大!谢谢!
          • 就我个人而言,我非常相信一个入口和一个出口点,但这只是我
          【解决方案6】:

          您需要在 for 循环之外编写以下代码,因为您的 for 在您获得匹配时中断,但您的 while 循环继续运行

           if (found){
                      System.out.println("Yeah, " + reservedWordToCheck + ", is reserved as a Java identifier.");
                      break;
           }
           else{
                      System.out.println("Nope, the word " + reservedWordToCheck + ", isn't reserved. Go hog wild.");
                      break;
           }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-03-10
            • 2014-07-10
            • 2017-09-12
            • 2014-07-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多