目录
nextLine( ) 前面不能出现 nextInt( ) 或 next( ):
一、题目
题目:收件人列表 题目链接:收件人列表
NowCoder每天要给许多客户写电子邮件。正如你所知,如果一封邮件中包含多个收件人,收件人姓名之间会用一个逗号和空格隔开;如果收件人姓名也包含空格或逗号,则姓名需要用双引号包含。
现在给你一组收件人姓名,请你帮他生成相应的收件人列表。
输入描述:
输入包含多组数据。每组数据的第一行是一个整数n (1≤n≤128),表示后面有n个姓名。
紧接着n行,每一行包含一个收件人的姓名。姓名长度不超过16个字符。
输出描述:
对应每一组输入,输出一行收件人列表。
输入
3
Joe
Quan, William
Letendre,Bruce
2
Leon
Kewell
输出
Joe, "Quan, William", "Letendre,Bruce"
Leon, Kewell
二、思路
观察题目要求及用例,发现本题实质上是对输入的字符串进行处理输出的问题。可以使用 List 存放每行的收件人,最后利用字符串拼接 join 方法进行输出。
在将每行的数据放入的过程中,进行判断:当数据中包含“ , ”或者“ ”,就将前后加上“”再放入List中。判断数据是否包含“ , ”或者“ ”的方法使用 contains() 方法。
注意:
在这个题目的输入中,既有 int 类型又有 String 类型,我们就要 nextInt() 和 nextLine() 的问题。
String next( ): 键盘录入任意符号(读取到空格外的有效字符后,回车结束,但只录取空格之前的有效字符)
String nextLine( ): 键盘录入一行,回车结束(录入什么就是什么)
int nextInt( ) :键盘录入一个整数,回车结束(只要整数,否则报异常)
nextLine( ) 前面不能出现 nextInt( ) 或 next( ):
因为 nextInt( ) 以回车作为结尾标志且它会把回车符留在内存中,当使用 nextInt( ) 录入一个整数按下回车后,整数被 nextInt( ) 读取,回车符会留在内存,如果 nextInt( ) 后面有 nextLine( ) 时,这个回车符便会直接被 nextLine( ) 读取。
解决方法:
在使用 next( )读取完一个整数后,因为有回车符在内存中,所以我们先使用 nextLine( ) 将这个回车符从内存中读取出来,然后再正常使用 nextLine() 读取要读取的数据。
三、代码
代码比较简单,重点是 next( ) 后面 nextLine( ) 的处理。
import java.util.*;
/**
* Created with IntelliJ IDEA.
* Description:收件人列表
* User: WangWZ
* Date: 2023-04-14
* Time: 11:22
*/
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
sc.nextLine(); //将回车接收掉(从内存中拿走)
List<String> list = new ArrayList<>();
for(int i = 0; i < n; i++) {
String str = sc.nextLine();
String str2 = str;
if(str.contains(",")||str.contains(" ")) {
str2 = "\"" + str + "\"";
}
list.add(str2);
}
System.out.println(String.join(", ",list));
}
}
}