【问题标题】:Problems with getting the command from user input从用户输入获取命令的问题
【发布时间】:2020-06-20 20:43:26
【问题描述】:

我目前正在努力使用获取输入命令的流。

看起来像这样


final Command command = commands.stream()
        .filter(cmd -> (input.startsWith(cmd.getName()) && (input.length() == cmd.getName().length()
                || input.charAt(cmd.getName().length()) == ' ')))
        .findAny()
        .orElseThrow(() -> new InvalidInputException("unknown command"));

例如,我的 ExitCommand 的 getName() 如下所示:


@Override
public String getName() {
    return "exit";
}

流工作得很好,除了它也接受像“exit”这样的输入。所以退出加一个空格。这不应该发生,我不知道如何解决这个问题。它相当复杂,因为有一个、两个和三个字长的命令。 (例如“退出”、“删除机车车辆”、“列出火车”)。

如果有人可以帮助我,我将非常感激。

【问题讨论】:

  • 我不知道有任何命令 shell 会因为有尾随空格而拒绝命令。这样的政策会让大多数用户感到惊讶。正确的行为还取决于您之后如何处理单词,例如,当有两个空格时会发生什么?

标签: java command-line command java-stream command-line-arguments


【解决方案1】:

如果总是有一些输入,并且命令始终是空格或输入结尾之前的第一个单词,那么首先执行String inputCommand = input.split(" ")[0]; 之类的操作如何,然后在命令集合中查找该确切值。

【讨论】:

  • 正如我所说,有一个两个字和三个字的命令。不幸的是,这在这里不起作用。
  • 哦,好吧 - 我以为命令只是第一个单词,其余的都是参数
  • 如果问题是开头或结尾的空格,您不能只使用修剪吗?或者,如果问题是任何地方的空间,您可以拆分输入,然后使用连接进行流式传输和收集,使用空格 - 这将在每个单词之间放置一个空格。简而言之,我认为首先清理输入比在搜索匹配命令时尝试这样做更容易。
  • 空间的问题就在最后。我将如何在这里使用 trim() ?我以前从未使用过这种方法。
  • Trim 非常简单 - 它只是 String 上的一种方法 - docs.oracle.com/javase/7/docs/api/java/lang/String.html#trim() 但再次查看您的问题,您是说要拒绝有尾随空格的输入,还是要拒绝输入宽松并接受它 - 您的代码看起来像您的目标是宽松,我认为从用户体验的角度来看这是有道理的,但取决于您的要求
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 2018-04-30
相关资源
最近更新 更多