【问题标题】:Split command does not function with Scanner拆分命令不适用于扫描仪
【发布时间】:2015-10-01 00:08:20
【问题描述】:

我尝试做类似这些人所做的事情: How to split a comma-separated string? 但是当我执行以下操作时:

String UserInput = new Scanner(System.in).next();
GradesNonInt = Arrays.asList(UserInput.replaceAll("\\s","").split(","));
System.out.println(GradesNonInt.size());

当我输入像“1,2,3”这样的字符串时,我会打印 3。当我输入“1, 2, 3”时,我会打印 1。出于某种原因,当字符串中有空格时它不想工作。

正如下面的答案之一所说,直接输入“1、2、3”似乎可以正常工作,但是当从 Scanner(System.in).next() 中获取时,它不是。

【问题讨论】:

  • 在 Stack Overflow 上,我们有 accepting answer 机制,而不是在标题中添加 [SOLVED]。如果一个答案包含描述为问题的问题的解决方案,则应将其标记为问题。如果答案很少,您可以标记一个您最喜欢的答案。

标签: java split java.util.scanner


【解决方案1】:

我尝试了以下代码,当我在 UserInput 字符串中使用“1、2、3”时它打印了 3

    String UserInput = "1, 2, 3";
    List<String> GradesNonInt = Arrays.asList(UserInput.replaceAll("\\s","").split(","));
    System.out.println(GradesNonInt.size());

问题不在于拆分,而是因为 Scanner 使用分隔符模式将其输入分解为标记,默认情况下匹配空格,这就是显示此行为的原因。 Refer this link.

如果您愿意,可以使用 Scanner 类的 useDelimiter method 将分隔符更改为空格以外的其他内容


更新

要将分隔符更改为下一行并确保代码接受字符串中的空格,您可以将代码更改为以下代码

    String UserInput = new Scanner(System.in).useDelimiter("\n").next();
    List<String> GradesNonInt = Arrays.asList(UserInput.replaceAll("\\s","").split(","));
    System.out.println(GradesNonInt.size());

【讨论】:

  • 谢谢,我实际上并没有意识到 UserInput 可能是问题所在。我将编辑 OP。
  • 由此得出的结论是问题出在new Scanner(System.in).next();...
  • @JoelHemphill 如果这个问题得到解决,那么你可以接受帮助你解决这个问题的答案
  • useDelimiter("\n") 风格不好。我们已经有了nextLine() 方法。如果我们在仅使用\r 的操作系统上使用此代码,也会导致很多问题。它还将阻止我们使用 1 2 3 形式的数据的此类 Scanner 的 hasNextInt 方法。
  • @Pshemo 我理解那部分。只是想展示分隔符的使用。他可以根据自己的需要选择任何其他分隔符,甚至可以选择nextLine() 方法
【解决方案2】:

问题是Scanner#next() 只能返回下一个token(直到找到下一个分隔符或数据结尾)。所以对于像1, 2, 3, 这样的输入,它将返回1,

使用Scanner#nextLine() 读取整行。

另外不要在每次要从用户读取数据时创建新的 Scanner 实例。为每个应用程序创建一个处理 System.in 的 Scanner 并重用它。

【讨论】:

    猜你喜欢
    • 2012-08-08
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    相关资源
    最近更新 更多