将java中的命令行参数与字符数组进行比较

时间:2014-04-04 23:03:20

标签: java string command-line-arguments arrays args

我正在为我的类编写一个程序,该程序从命令行(java A D C B等)获取参数并将它们与字符数组进行比较。在这种情况下,它是考试的关键,命令行参数是答案。我想我几乎弄明白了,但是已经遇到了一个arrayIndexOutofBoundsException:1。我对命令行参数不是很熟悉,所以我可能会遗漏一些重要的东西,但这些信息在我的java书中没有涉及。任何意见,将不胜感激。提前谢谢。

代码:

public class GradeExam {
  /** Main method */
  public static void main(String args[]) {


    // Key to the questions
    char[] keys = {'D', 'B', 'D', 'C', 'C', 'D', 'A', 'E', 'A', 'D'};

    int correctCount = 0;

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

        String newargs = args[i];

        char[] argarray = newargs.toCharArray();

        for (int j = 0; j < args.length; j++) {
             if (argarray[j] == keys[j])
                 correctCount++;
        }

      }

      System.out.println("Your correct count is " +
              correctCount);

  }
}


Input: java GradeExam D B D C C D A E A D

Expected output: Your correct count is 10

3 个答案:

答案 0 :(得分:1)

如果你这样打电话给这个节目......

java GradeExam D B D C C D A E A D

...然后每个字母都是一个单独的参数(args[0] = "D"args[1] = "B"等)。根据您的代码,我认为您打算这样做:

java GradeExam DBDCCDAEAD

你也可能希望你的内循环看起来像这样:

for (int j = 0; j < argarray.length && j < keys.length; j++) {
    if (argarray[j] == keys[j])
        correctCount++;
}

然后,即使命令行参数包含太多或太少的字母,您也不会在任何一个数组的末尾运行。

答案 1 :(得分:0)

你在这一行得到arrayIndexOutofBoundsException: 1

if (argarray[j] == keys[j])

因为argarray始终只有一个元素,j0...args.length获取值。

此外,您根本不需要内部循环,您可以像这样简化程序:

public static void main(String args[]) {
    char[] keys = {'D', 'B', 'D', 'C', 'C', 'D', 'A', 'E', 'A', 'D'};
    int correctCount = 0;
    for (int i = 0; i < args.length && i < keys.length; i++) {
        if (args[i].charAt(0) == keys[i]) {
            correctCount++;
        }
    }
    System.out.println("Your correct count is " + correctCount);
}

答案 2 :(得分:0)

问题是:

 char[] argarray = newargs.toCharArray();

    for (int j = 0; j < args.length; j++) {
         if (argarray[j] == keys[j])
             correctCount++;
    }

您实际上是在尝试将当前正在查看的String参数转换为字符数组,而实际上您应该将String参数转换为单个字符。将它转换为角色后,您可以将其与您正在查看的当前密钥进行比较。

您可能希望在开头做一些检查,以确保给出的答案数量等于键数,如下所示。

public class GradeExam {

public static void main(String[] args) {

    char[] keys = {'D', 'B', 'D', 'C', 'C', 'D', 'A', 'E', 'A', 'D'};

    if (args.length != keys.length) {
        throw new RuntimeException("Expected number of input answers: " + keys.length + " but got " + args.length);
    }

    int correctCount = 0;
    try {
        for (int i = 0; i < keys.length; i++) {
            char key = keys[i];
            // We need to convert the String into a character
            char answerChar = args[i].charAt(0);
            if (answerChar == key) {
                correctCount++;
            }
        }
    } catch (IndexOutOfBoundsException ex) {
        ex.printStackTrace();
    }

    System.out.println("Your correct count is " + correctCount);

}

}