【问题标题】:Stop Scanner while reading Integers or String在读取整数或字符串时停止扫描仪
【发布时间】:2021-03-06 20:15:45
【问题描述】:

我正在尝试使用扫描仪读取字符串,然后读取整数或字符串:

public class Main {
    public static void main (String[] args){
        String[] StringList; 
        Integer[] IntegerList;
        ArrayList<String> auxS = new ArrayList<>();
        ArrayList<Integer> auxI = new ArrayList<>();
        String order; int ord=-1;
        Scanner scan = new Scanner(System.in);
        order = scan.nextLine();
        //do something with order

        while(scan.hasNextLine()){
            if(scan.hasNextInt()){
                auxI.add(scan.nextInt());
            }
            else if(!scan.nextLine().isEmpty()){
                auxS.add(scan.nextLine());
            }else{ //I've tried using another scan. methods to get to this point
                scan.next();
                break;
            }
        }
    }
}

如您所见,我首先读取一个字符串并将其按“顺序”存储,然后我想继续阅读直到 EOF 或用户输入“Enter”或任何其他非特定内容,例如“write 'exit'”或类似的东西。 我尝试过使用 scan.hasNext、hasNextLine 和其他涉及最后一个 else 的组合,但它们都不起作用。
如果输入是:

>>THIS WILL BE STORED IN ORDER<<
123
321
213
231
312
<enter>

我希望它在最后一行没有输入任何内容时停止。将整数或字符串存储在它们自己的 ArrayList 中很重要,因为我稍后会使用它,并且需要识别每个输入数据的类型(这就是我在 while 循环中使用 hasNextInt 的原因)。

【问题讨论】:

  • 您可以使用 BufferedReader 获得更多控制权。

标签: java input while-loop java.util.scanner


【解决方案1】:

一般情况下,不要使用.nextLine(),它会造成混淆,而且很少能满足您的需求。如果要将整行作为单个项目读取,请更新扫描仪的分隔符;将其从默认的“任何空格序列”更改为“单个换行符”:scanner.useDelimiter("\r?\n"); 将执行此操作(在制作扫描仪后立即运行)。要读取一行,请使用任何.next() 方法(但不是.nextLine()):想要一个int?致电.nextInt()。想要任何字符串?致电.next(),等等。

然后拆分你的 if/elseif 块。空行仍然是一个字符串,只是一个空行:

if (scanner.hasNextInt()) {
    // deal with ints
} else {
   String text = scanner.next();
   if (!text.isEmpty()) {
       // deal with strings
   } else {
       // deal with a blank line
   }
}

注意:一旦您停止使用.nextLine(),您就不必抛出半随机的.nextLine() 调用来“清除缓冲区”或诸如此类的东西。这种烦恼就消失了,这是您应该忘记 nextLine 的众多原因之一。一般来说,对于扫描仪,要么只使用.nextLine(),要么永远不要使用.nextLine(),结果会好很多。

【讨论】:

  • 这对整数来说就像一个魅力。我正在对此进行测试,当我使用它来存储字符串(一个单词)时,它并不总是按照我的意愿存储它们。即,如果我输入“hello”“hi” 等 10 次,它不会存储 10 个单词
  • @Izanami 这又是一个线程问题,与扫描仪无关。在编写这样的处理程序时不要使用字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
相关资源
最近更新 更多