【问题标题】:How to scan words in a text without newline character?如何扫描没有换行符的文本中的单词?
【发布时间】:2014-01-10 04:41:51
【问题描述】:

我很难理解扫描仪类的工作原理。事实上,我想从这个输入:

AAAA BBBG GREZZ

ADFG GTRE

冻结

将此输出作为 ArrayList: [AAAA、BBBG、GREZZ、ADFG、GTRE、FREZZ]

我的代码如下:

System.out.println("list of words?");
Scanner scan3 = new Scanner(System.in);
scan3.useDelimiter("[\\s+\\n]");
ArrayList<String> test = new ArrayList<String>();
while(scan3.hasNext()){
  String temp = scan3.next();
  if(temp.equals("STOP")){
     break;
  }else{
     test.add(temp);
  }
}
System.out.println(test);

我的输入是:

AAAA BBBG GREZZ

ADFG GTRE

冻结停止

我的输出是: [AAAA, BBBG, GREZZ, , ADFG, GTRE, , FREZZ]

我的问题有两个:

  • 为什么我在列表中插入了一个空元素(我认为这与新行有关)?
  • 您可能已经注意到,我在末尾添加了字符串“STOP”以停止循环,因为条件 scan3.HasNext() 总是返回“true”,这是唯一的方法吗?

非常感谢您的帮助。

【问题讨论】:

    标签: java java.util.scanner next


    【解决方案1】:

    只需使用带有合适分隔符的String#split()(听起来在这种情况下您只需要"[ \\n]+"(这是一个空格和一个\n)但您可能需要稍微调整一下,例如您可能想要在所有空格上拆分。

    列表中出现空条目的原因是因为您只是在扫描单个空白字符。当您有两个相邻的行尾时,这将匹配两次。您需要修改正则表达式,使其匹配多个字符。

    【讨论】:

    • 感谢您的回答。但是要使用String.split(),我首先需要获取完整的字符串,但要这样做,我需要扫描我的文本,这样它就不会改进代码,是吗?按照你说的修改我的正则表达式后,我没有空条目了,但我不明白你的解释:you have two line endings next to each other:怎么可能?
    • AAAA BBBG GREZZ ADFG GTRE 这两行之间有 2 个行尾,所以当你拆分它时,它会在空行上找到空字符串。
    【解决方案2】:

    您的+ 似乎放错了位置。改用scan3.useDelimiter("[\\s\\n]+");

    关于,

    您可能已经注意到,我在末尾添加了字符串“STOP”以停止循环,因为条件 scan3.HasNext() 总是返回“true”,这是唯一的方法吗?

    您还希望以其他方式进行吗?您还打算使用什么其他停止条件?

    【讨论】:

    • 首先感谢您的回答。关于停止条件,它实际上看不到任何其他方法可以做到这一点,但对我来说它看起来像是修补工作。问题是我不明白为什么scan3.HasNext() 在没有更多内容时返回true(我按下了Enter 按钮)
    • @user3125129:因为如果它确实返回了 false,那么它将完全不起作用,因为它无法等待用户输入。它如何区分等待输入和完成输入?稍微想一想,你就会明白了。
    猜你喜欢
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 2014-02-21
    • 2022-11-18
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多