【问题标题】:Pattern/Array issue in javajava中的模式/数组问题
【发布时间】:2012-08-02 05:25:46
【问题描述】:

我正在为下个月即将举行的考试而学习,并研究一些基本问题。这是一个程序,需要输入几个句子并重新打印任何包含特定字符串的程序,在这种情况下为“模式”。

我的尝试如下,它可以编译,但是在尝试运行它时收到以下错误:

   Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at Grep.main(Grep.java:18)
import java.util.Scanner;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Grep {

    public static void main(String[] args) {

        Pattern pattern = Pattern.compile("[Pp]attern");
        String sentences[] = new String[10];
        Scanner scanner = new Scanner(System.in); 

        System.out.println("Please enter some sentences: ");

        for (int i = 0; i <= sentences.length; i++) {
            String s = scanner.next(); 
            sentences[i] = s;
        }

        for (int i = 0; i < sentences.length; i++) { 
            Matcher matcher = pattern.matcher(sentences[i]);
            while (matcher.find()) {
                System.out.println(sentences[i]);
            }
        }
    }
}

【问题讨论】:

    标签: java regex arrays


    【解决方案1】:
    for (int i = 0; i <= sentences.length; i++) {
    

    数组中有多少项?最后的索引是什么?您的循环使用的最后一个索引是什么?你的循环总共访问了多少句?

    【讨论】:

      【解决方案2】:

      试试这个。它有效。

      提示: 确保使用 nextLine() 以便输入将读取完整的句子。我将您的 while 循环切换为 for 循环中的 if 语句。那里不需要两个循环。而且我还将您的第一个 for 循环压缩为一行。如果您只需要一秒钟,则无需创建字符串变量。完全跳过这一步,直奔主题!祝你好运,希望这会有所帮助!

      下面是一个反映您但现在有效的程序

      import java.util.Scanner;
      import java.util.regex.Matcher;
      import java.util.regex.Pattern;
      
      public class Grep 
      {
          public static void main(String[] args) 
          {
              Pattern pattern = Pattern.compile("[Pp]attern");
              String sentences[] = new String[3];
              Scanner scanner = new Scanner(System.in);
      
              System.out.println("Please enter some sentences: ");
      
              for (int i = 0; i < sentences.length; i++) 
                  sentences[i] = scanner.nextLine();
      
              for (int i = 0; i < sentences.length; i++) 
              { 
                  Matcher matcher = pattern.matcher(sentences[i]);
                  if (matcher.find()) 
                      System.out.println(sentences[i]);
              }
          }
      } 
      

      下面是我将如何编写这个相同的程序。包含用于澄清的评论

      import java.util.Scanner;
      import java.util.regex.Matcher;
      import java.util.regex.Pattern;
      
      public class Grep 
      {
          public static void main(String[] args) 
          {
              // Initialize and Declare Variables
              Pattern pattern = Pattern.compile("[Pp]attern");
              String sentences[] = new String[3];
              Scanner scanner = new Scanner(System.in);
              int foundCount = 1;
      
      
              // Present A Title For The End User
              System.out.println("This Program Will Catch Sentences With The Term Pattern.\n");
      
      
              // Read The Inputs From The Users
              for (int i = 0; i < sentences.length; i++)
              {
                  System.out.print("Enter Sentence #" + (i+1) + ":  ");
                  sentences[i] = scanner.nextLine();
              }
      
      
              // Line Break
              System.out.println();
      
      
              // Write Sentences That Include The Term Pattern
              for (int i = 0; i < sentences.length; i++) 
              { 
                  Matcher matcher = pattern.matcher(sentences[i]);
                  if (matcher.find())
                  {
                      System.out.println(foundCount + ")  " + sentences[i]);
                      foundCount++;
                  }
              }
          }
      }
      

      【讨论】:

      • 非常感谢您的帮助。关于如何从命令行调用搜索词的任何提示?例如,如果我想在输入中搜索模式并调用“java Grep 模式”。
      【解决方案3】:
      for (int i = 0; i <= sentences.length; i++) {
      

      &lt;= 必须是 &lt;,因为你从 0 开始,你有 10 个项目,所以 i 必须从 0 到 9。

      【讨论】:

      • 太棒了,完全错过了。谢谢。
      【解决方案4】:

      问题在于代码的:18for (int i = 0; i &lt;= sentences.length; i++) 应该是for (int i = 0; i &lt; sentences.length; i++)

      正如您自己在 next 中的代码中的 for 循环使用 &lt; 而不是 &lt;=

      【讨论】:

      • Java 通常使用从 0 开始的索引,因此最后一个元素将位于位置 (size - 1)。
      【解决方案5】:

      试试

      for (int i = 0; i < sentences.length; i++)
      

      你会没事的:)

      【讨论】:

      • 太棒了,完全错过了。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 2011-06-15
      相关资源
      最近更新 更多