【问题标题】:Array validation through a while loop通过while循环进行数组验证
【发布时间】:2016-06-07 18:24:54
【问题描述】:

我正在做“石头、纸、剪刀”游戏,我想检查输入是否与任何数组匹配,现在我有这个代码并且它运行完美:

String[] rockArray = {"Rock","rock","1"},
         paperArray = {"Paper","paper","2"},
         scissorsArray = {"Scissors","scissors","3"};
String[][] answersArray = {rockArray, paperArray, scissorsArray};

//Scanner
Scanner scan = new Scanner(System.in);

// Input
System.out.print("\nRock, Paper or Scissors? -> ");
String answer = scan.next();

 // Checking if the input contains the right values
 while(!Arrays.asList(answerRock).contains(answer) &&
       !Arrays.asList(answerPaper).contains(answer) &&
       !Arrays.asList(answerScissors).contains(answer)) {

         System.out.print("Try again: ");
         answer = scan.next();
 }

但我想让它变得简单,这是我的想法,但由于某种原因它不起作用:

// Here is my arrays 
String[] rockArray = {"Rock","rock","1"},
         paperArray = {"Paper","paper","2"},
         scissorsArray = {"Scissors","scissors","3"};
String[][] globalArray = {rockArray, paperArray, scissorsArray};

// Input
System.out.print("\nRock, Paper or Scissors? -> ");
String answer = scan.next();

//Validation
while(!Arrays.asList(globalArray).contains(answer) {
      System.out.println("Try again: ");
      answer = scan.next();
}

非常感谢!

【问题讨论】:

标签: java arrays validation arraylist while-loop


【解决方案1】:
String[][] globalArray = {rockArray, paperArray, scissorsArray};
...
Arrays.asList(globalArray)

Arrays.asList() 的调用将创建包含 3 个元素的列表,即 3 数组,而不是包含数组内容的列表。然后,当您使用contains 搜索元素时,您将始终得到false,因为answer 永远不会出现在数组中(怎么会,它是String 而不是数组)。

我建议你这样做:

List<String> allAnswers = Arrays.asList(rockArray);
allAnswers.addAll(Arrays.asList(paperArray));
allAnswers.addAll(Arrays.asList(scissorsArray));
...
while(!allAnswers.contains(answer)) {
  ...

这也使您不必一遍又一遍地调用Arrays.asList(),从而提高性能。

【讨论】:

    【解决方案2】:

    !Arrays.asList(globalArray).contains(answer) 不起作用,因为Arrays.asList(...) 方法将输出List&lt;String[]&gt; 而不是List&lt;String&gt;

    如果你真的想使用asList(...),你必须输入String[] allPossibleInputString

    【讨论】:

      【解决方案3】:

      你的第二个代码 sn-p 不起作用,因为你不能这样做!Arrays.asList(globalArray).contains(answer)

      一种解决方案是将三个数组的内容复制到您的全局数组中,如下所示:

      String[] rockArray = {"Rock","rock","1"},
               paperArray = {"Paper","paper","2"},
               scissorsArray = {"Scissors","scissors","3"};
      String[] globalArray = new String[9];
      /* Copy Contents To Global Array */
      System.arraycopy(rockArray, 0, globalArray, 0, 3);
      System.arraycopy(paperArray, 0, globalArray, 3, 3);
      System.arraycopy(scissorsArray, 0, globalArray, 6, 3);
      

      现在你可以这样做了:

      while(!Arrays.asList(globalArray).contains(answer)) {
          System.out.println("Try again: ");
          answer = scan.nextLine();
      }
      

      【讨论】:

      • 对,所以我问有没有其他方法可以做到?
      • 在这种情况下,如果我输入“test”,我会得到一个无限循环,除了正确的输入之外它不会
      • 那是因为它应该是scan.nextLine() 而不仅仅是scan.next()。它完美地工作。在这里查看:ideone.com/kB4U3n
      • @S.Anthony 欢迎您! :)
      猜你喜欢
      • 2015-07-07
      • 2018-04-08
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      相关资源
      最近更新 更多