java如何输入字符跳出循环,Java 中实现以换行为结束输入的方法

一、问题描述

最近在刷题的过程中,发现许多题都是要求以不再输入数据作为结束输入的标志。

比如有一题的输入要求如下:

输入可能有多组数据。每组数据都包括多行,第一行先输入个数 N,接下来的 N 行再输入相应个数的整数。当不再输入数据时结束输入。

输入示例:

2

1

2

3

10

4

5

对于上面的输入,实际是两组数据,每一组的首个数字代表本组的数据个数。第一组的数据为[1, 2],第二组数据为 [10, 4, 5]。

二、解决方案

在 Java 中,我们一般都是以特定字符串来结束输入,比如 “exit”、“q” 等。而此类题目要求当不再输入数据时结束输入,也就是说以换行(或理解为空字符)结束输入。

我们知道,常用的输入方法有:next()、nextLine() 。它们的使用说明如下:

next() 方法来实现输入,其在读取内容时,会过滤掉有效字符前面的无效字符,对输入有效字符之前遇到的空格键、Tab键或 Enter 键等结束符,next() 方法会自动将其过滤掉。

nextLine() 方法字面上有扫描一整行的意思,它的结束符只能是 Enter 键,即 nextLine() 方法返回的是 Enter 键之前没有被读取的所有字符,它是可以得到带空格的字符串的。

从上面的描述我们可以看出来,理论上是可以通过 nextLine() 来实现换行结束输入的。

于是一开始我是这么写的:

public static void main(String[] args) {

Scanner input = new Scanner(System.in);

ArrayList> list = new ArrayList<>();

ArrayList once;

while (true){

String a = input.nextLine();// 首先输入一个数,代表本组数据个数

if (a.isEmpty()){

break;

}

once = new ArrayList<>();

int count = Integer.parseInt(a);

for(int i=0; i

int temp = input.nextInt();

once.add(temp);

}

list.add(once);

}

System.out.println(list);

}

然而经过实践发现,这种写法无法实现多组数据的输入,即输入完一组数据之后,将会自动退出循环。

之所以出现这种情况,其根源在于:

nextInt() 不会读取 \n,而 nextLine() 读取一行文本,会将 nextInt() 方法遗留下来的 \n 字符读入,因此会退出循环。

知道问题所在,就很好解决了。对于这类问题,我目前摸索出了两种方法:

方法一:在 nextInt() 后面再加一个 nextLine() 来消除 \n 字符。

方法二:每次使用 nextLine() 之前,重新创建一个输入流对象。

三、代码实现

方法一: 在 nextInt() 后面再加一个 nextLine() 来消除 \n 字符。

代码实现如下:

public static void main(String[] args) {

Scanner input = new Scanner(System.in);

ArrayList> list = new ArrayList<>(); // 存放所有数据

ArrayList once;// 存放每组数据

while (true){

String a = input.nextLine();// 首先输入一个数,代表本组数据个数

if (a.isEmpty()){// 如果输入为空,退出

break;

}

once = new ArrayList<>();

int count = Integer.parseInt(a);

for(int i=0; i

int temp = input.nextInt();

once.add(temp);

}

list.add(once);

/* 方法一:在这里附加一个 nextLine() 方法读取多余的 \n */

input.nextLine();

}

System.out.println(list);

}

方法二: 每次使用 nextLine() 之前,重新创建一个输入流对象。

代码实现如下:

public static void main(String[] args) {

Scanner input = new Scanner(System.in);

ArrayList> list = new ArrayList<>(); // 存放所有数据

ArrayList once;// 存放每组数据

while (true){

String a = input.nextLine();// 首先输入一个数,代表本组数据个数

if (a.isEmpty()){// 如果输入为空,退出

break;

}

once = new ArrayList<>();

int count = Integer.parseInt(a);

for(int i=0; i

int temp = input.nextInt();

once.add(temp);

}

list.add(once);

/* 方法二:需要在这里重新 new 一个 Scanner */

input = new Scanner(System.in);

}

System.out.println(list);

}

标签:nextLine,Java,ArrayList,以换,new,input,输入,once

来源: https://blog.csdn.net/zhuxian1277/article/details/114262605

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值