Java之Scanner.nextLine()讀取回車的問(wèn)題及解決
問(wèn)題描述
我們?cè)谑褂胘ava讀取鍵盤(pán)輸入時(shí),如果先讀取一個(gè)int變量,再讀取下一行的字符串時(shí),會(huì)發(fā)現(xiàn)程序運(yùn)行結(jié)果與預(yù)期不符,程序并沒(méi)有讀取到下一行的字符串。
即發(fā)生在如下情形:
Scanner sc=new Scanner(System.in); int n=sc.nextInt(); String s=sc.nextLine();
問(wèn)題分析
從代碼分析我們的需求是先輸入一個(gè)int變量,再在下一行輸入一個(gè)字符串,也就是說(shuō)我們使用鍵盤(pán)輸入的時(shí)候,其實(shí)輸入了三部分:
3
words
分別是:數(shù)字3,換行符,字符串words。
如何處理多出來(lái)的換行符
從剛才的分析可以看到,問(wèn)題的原因是nextLine()方法沒(méi)有讀取到我們的字符串,而是讀入了我們的Enter換行符。
方法一
既然多出了一個(gè)換行符,那我們可以在讀取字符串之前將換行符讀掉:
Scanner sc=new Scanner(System.in); int n=sc.nextInt(); sc.nextLine();//將換行符讀掉 String s=sc.nextLine();
方法二
重新創(chuàng)建Scanner對(duì)象:
Scanner sc1=new Scanner(System.in); int n=sc1.nextInt(); Scanner sc2=new Scanner(System.in); String s=sc2.nextLine();
這樣在讀取完n之后,換行符會(huì)被丟棄,下一行被視作sc2開(kāi)始讀入的位置。
實(shí)戰(zhàn)
下面是tengxun公司2020年4月26日暑期軟件相關(guān)崗位實(shí)習(xí)筆試的第一題:
數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)之一一隊(duì)列
隊(duì)列有五種基本操作,插入隊(duì)尾、取出隊(duì)首、刪除隊(duì)首、隊(duì)列大小、清空隊(duì)列。
現(xiàn)在讓你模擬一個(gè)隊(duì)列的操作,具體格式參考輸入。
輸入描述:
第一行輸入一個(gè)整數(shù)T,表示接下來(lái)有T組測(cè)試數(shù)據(jù)。
對(duì)于每組測(cè)試數(shù)據(jù):
第一行輸入一個(gè)整數(shù)Q,表示有Q次操作。
接下來(lái)Q行,每行輸入一種隊(duì)列操作方式,具體格式如下:
初始狀態(tài)下隊(duì)列為空。
插入隊(duì)尾: PUSH X
取出隊(duì)首: TOP//僅僅是看一下隊(duì)首元素,不要把隊(duì)首元素刪除
刪除隊(duì)首: POP
隊(duì)列大小: SIZE
清空隊(duì)列: CLEAR
1<T<100
1<Q,X≤1000
保證操作為以上5種的任意一種。
輸出描述:
對(duì)于每組測(cè)試數(shù)據(jù):
如果操作為“取出隊(duì)首”,輸出隊(duì)首元素,如果無(wú)法取出,輸出“-1”
如果操作為“刪除隊(duì)首”,如果無(wú)法刪除,輸出“-1”
如果操作為“隊(duì)列大小”,輸出隊(duì)列大小
其他操作無(wú)需輸出
示例輸入
2
7
PUSH 1
PUSH 2
TOP
POP
TOP
POP
POP
5
PUSH 1
PUSH 2
SIZE
POP
SIZE
結(jié)果:
1
2
-1
2
1
問(wèn)題解答
這道題并不難,使用LinkedList就可以實(shí)現(xiàn)上述操作,當(dāng)然,Queue的底層實(shí)現(xiàn)本來(lái)也就是LinkedList。
之所以列舉這道題是因?yàn)檫@道題會(huì)出現(xiàn)nextLine()讀取失敗的問(wèn)題,因?yàn)槲覀兪紫纫x取整形變量T,之后再往后逐行讀取,如果不處理?yè)Q行符的問(wèn)題,將導(dǎo)致程序運(yùn)行出現(xiàn)異常。
我的AC答案:
import java.util.LinkedList; import java.util.List; import java.util.Scanner; public class Main { ? ? public static void main(String[] args) { ? ? ? ? Scanner sc =new Scanner(System.in); ? ? ? ? int t=sc.nextInt(); ? ? ? ? while(t>0){ ? ? ? ? ? ? int q=sc.nextInt(); ? ? ? ? ? ? List<Integer> n=new LinkedList<>(); ? ? ? ? ? ? for(int i=0;i<=q;i++){//注意!i<=q,這里的‘='就是因?yàn)閝和第一行輸入之間的換行符 ? ? ? ? ? ? ? ? String s=sc.nextLine(); ? ? ? ? ? ? ? ? if(s.equals("")){//在這道題中,當(dāng)我讀取到換行符時(shí),直接跳過(guò),不做任何操作 ? ? ? ? ? ? ? ? ? ? continue; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? if(s.startsWith("PUSH")){ ? ? ? ? ? ? ? ? ? ? n.add(Integer.parseInt(s.split(" ")[1])); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else if(s.equals("TOP")){ ? ? ? ? ? ? ? ? ? ? if(n.size()==0){ ? ? ? ? ? ? ? ? ? ? ? ? System.out.println(-1); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? ? ? ? ? System.out.println(n.get(0)); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else if(s.equals("POP")){ ? ? ? ? ? ? ? ? ? ? if(n.isEmpty()){ ? ? ? ? ? ? ? ? ? ? ? ? System.out.println(-1); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? else ? ? ? ? ? ? ? ? ? ? ? ? n.remove(0); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else if(s.equals("SIZE")){ ? ? ? ? ? ? ? ? ? ? System.out.println(n.size()); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else if(s.equals("CLEAR")){ ? ? ? ? ? ? ? ? ? ? n.clear(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? t--; ? ? ? ? } ? ? } }
在上面的代碼中,我首先使用了
for(int i=0;i<=q;i++)
注意到了q與接下來(lái)的輸入之間的換行符。
之后,當(dāng)遇到換行符時(shí):
String s=sc.nextLine(); if(s.equals("")) ? ? continue;
來(lái)解決該問(wèn)題。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
論java如何通過(guò)反射獲得方法真實(shí)參數(shù)名及擴(kuò)展研究
這篇文章主要為大家介紹了java如何通過(guò)反射獲得方法的真實(shí)參數(shù)名以及擴(kuò)展研究,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步早日升職加薪2022-01-01Spring AOP如何自定義注解實(shí)現(xiàn)審計(jì)或日志記錄(完整代碼)
這篇文章主要介紹了Spring AOP如何自定義注解實(shí)現(xiàn)審計(jì)或日志記錄(完整代碼),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12JAVA中堆、棧,靜態(tài)方法和非靜態(tài)方法的速度問(wèn)題
這篇文章主要介紹了JAVA中堆、棧,靜態(tài)方法和非靜態(tài)方法的速度問(wèn)題,堆和棧得速度性能分析多角度給大家分析,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08Kafka是什么及如何使用SpringBoot對(duì)接Kafka(最新推薦)
這篇文章主要介紹了Kafka是什么,以及如何使用SpringBoot對(duì)接Kafka,今天我們通過(guò)一個(gè)Demo講解了在SpringBoot中如何對(duì)接Kafka,也介紹了下關(guān)鍵類?KafkaTemplate,需要的朋友可以參考下2023-11-11java中struts2實(shí)現(xiàn)文件上傳下載功能實(shí)例解析
這篇文章主要介紹了java中struts2實(shí)現(xiàn)文件上傳下載功能的方法,以實(shí)例形式較為詳細(xì)的分析了struts2實(shí)現(xiàn)文件上傳下載功能的具體實(shí)現(xiàn)技巧與相關(guān)問(wèn)題的解決方法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01