【问题标题】:Java - Separate input based on lettersJava - 基于字母的单独输入
【发布时间】:2015-11-01 19:52:48
【问题描述】:

我一直在寻找这个但找不到它。我想使用 Scanner 从 Java 中的用户获取命令移动输入。用户可以进行的输入是 U(上)、D(下)、L(左)、R(右)。因此,例如,如果用户编写 UDULR(没有将它们分开),那么我想分别阅读这些字母。我试过这样:

String command;
char command;
Scanner scan = new Scanner(System.in);

System.out.println("Enter commands U(up),D(down),L(left),R(right);
//command = scan.next();                       
command = scan.next().charAt(0);

if(command == 'U'){
    "Do this"
}
else if(command == 'D'){
    "Do that"
}

当我使用此代码时,它只识别第一个字母(在这种情况下,我知道charAt(0) 代表第一个字母)。但是如何获得其他输入呢?我用 String 和 char 都试过了。

【问题讨论】:

  • 你可能需要像 scan.next().split('') 这样的东西,它会给你一个命令数组。然后你可以循环这些命令

标签: java string input char


【解决方案1】:

默认情况下,Scanner 使用一个或多个空格作为分隔符,用于分隔标记,因此next 返回表示整个单词的标记,而不是单个字符。

如果您希望next 返回单个非空白字符,则可以将分隔符设置为

  • 一系列空格(\s+ 在正则表达式中,其中\ 需要在字符串中写为"\\"

  • 空字符串""

但由于zero OR one or more of Xzero or more of X 相同,而不是+ 在正则表达式中表示“一次或多次出现”,我们可以使用* 表示“零次或多次出现”。所以代表我们的分隔符的正则表达式可能看起来像\s+(在字符串文字中需要写成"\\s+",因为\需要被转义)

演示:

Scanner scan = new Scanner(System.in);
scan.useDelimiter("\\s*");
System.out.println("Enter commands U(up),D(down),L(left),R(right)");
String command = scan.next();

if (command.equalsIgnoreCase("U")) {
    System.out.println("Do this");
} else if (command.equalsIgnoreCase("D")) {
    System.out.println("Do that");
} else {
    System.out.println("unknown command: "+ command);
}

根据您的评论,您似乎想要处理作为一个单词传递的一组命令,例如 UDULR,它应该向上、向下、向上、向左和最后向右移动。在这种情况下,您可以像这样组织代码:

private void moveUp(){
    //code for moving up:
    System.out.println("moving up");
}

private void moveDown(){
    //... similar 
}
//rest of moving methods...

现在您可以再添加一个方法,让我们根据传递给它的 char 选择要使用的方法:

public void move(char dirrection){
    switch(dirrection){
       case 'U' : moveUp(); break;
       case 'D' : moveDown(); break;
       case 'L' : moveLeft(); break;
       case 'R' : moveRight(); break;
       default: System.out.println("can't move in dirrection: "+dirrection);
    }
}

现在在您的代码中,您应该可以使用如下内容:

System.out.println("Enter commands U(up),D(down),L(left),R(right)");
String command = scan.next();

for (char directionCommand : command.toCharArray()){
    move(directionCommand);
}

【讨论】:

  • 感谢您的回答。如果用户按下例如 UD,那么我想同时打印“做这个”“做那个”,但在这个例子中它只打印第一个。我想也许 if 语句是错误的?我该如何解决?
  • 在这种情况下,您希望将其读取为单词(因此无需更改原始分隔符)并简单地遍历该单词中的所有字符并对所有字符采取相应的行动。将更新我的答案。
  • @toppen 我更新了我的答案。如果您不希望这些方法依赖于您的类的实例,您可能需要将它们设为静态。
【解决方案2】:

您需要将next() 的结果保存在一个变量中;那么你可以使用它以你想要的任何顺序获取其中的任何字符。

【讨论】:

  • 感谢您的回答,但我不太明白,如何将 next() 的结果保存在变量中?然后我如何从该变量中获取字符?
  • 你认为 command= 有什么作用?你认为 charAt(i) 有什么作用?
  • 那么命令 = 看看 charAt(i) 是否与输入相同?
  • '此方法返回位于字符串指定索引处的字符。字符串索引从零开始。所以基本上 command = 会查看指定索引中的字符。 0,1,2 等等,对吧?
  • 这就是 charAt() 的作用; command = *assigns" 将结果赋给变量 command。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 2017-11-21
  • 2018-06-01
  • 1970-01-01
相关资源
最近更新 更多