關(guān)于scanner.nextInt()等next()和scanner.nextIine()連用注意事項(xiàng)
scanner.nextInt()等next()和scanner.nextIine()連用注意事項(xiàng)
背景:需求是輸入二維矩陣行列數(shù)和矩陣的內(nèi)容。
我想要的效果是這樣的,用兩個(gè)int記錄第一行輸入行列數(shù),剩下用string記錄用戶輸入的二維矩陣內(nèi)容。
實(shí)操出現(xiàn)問題
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
int x = scanner.nextInt();
int y = scanner.nextInt();
if (x==0&&y==0) {
scanner.close();
break;
}
//scanner.nextLine();
String a = "";
for (int i = 0; i < x; i++) {
a +=scanner.nextLine();
}
for (int i = 0; i < a.length(); i++) {
if (i%y == 0) {
System.out.println();
}
System.out.print(a.charAt(i));
}
}
}
輸入?yún)s出現(xiàn)了問題,本想輸入4行4列,卻只接收了3行數(shù)據(jù),就開始打印了
如圖:

原因
這就涉及到next()與nextline()方法區(qū)別的。
- nextInt()的API寫到 “將輸入信息的下一個(gè)標(biāo)記掃描為一個(gè) int”;
- nextline()是“此掃描器執(zhí)行當(dāng)前行,并返回跳過的輸入信息。 此方法返回當(dāng)前行的其余部分,不包括結(jié)尾處的行分隔符。當(dāng)前位置移至下一行的行首。 因?yàn)榇朔椒〞?huì)繼續(xù)在輸入信息中查找行分隔符,所以如果沒有行
分隔符,它可能會(huì)緩沖所有輸入信息,并查找要跳過的行。”
(假設(shè)還是以上輸入)所以上面的代碼分析是這樣的:
/*用戶輸入: 4空格4\n //遇到空格結(jié)束 x=4, 第二nextInt()遇到換行了結(jié)束它的掃描 y=4; 但是此行還沒有結(jié)束,nextLine會(huì)繼續(xù)掃描剩余部分直到換行,光標(biāo)才會(huì)進(jìn)入下一行 只不過剩余的是空字符串,記第一次nextLine()為a1,a1="" ****\n //a2 = "****",a2記第二次nextLine() ....\n //a3= "...." ....\n //a4= "...." ****\n //此刻此行沒有對應(yīng)的nextline(),也就無法輸入了,接下就執(zhí)行打印輸出了。 */
解決
在nextInt()與想接收數(shù)據(jù)nextline()之間再添加一行scanner.nextLine();用于緩沖換行符,換入新的一行。
int x = scanner.nextInt();
int y = scanner.nextInt();
if (x==0&&y==0) {
scanner.close();
break;
}
scanner.nextLine();//用于緩沖換行符,換入新的一行。
String a = "";
for (int i = 0; i < x; i++) {
a +=scanner.nextLine();
}
Scanner類: next() 與 nextLine()與nextInt()
next()、nextLine()、nextInt()是scanner內(nèi)置的方法。
next()
1、一定要讀取到有效字符后才可以結(jié)束輸入。
2、對輸入有效字符之前遇到的空白,next() 方法會(huì)自動(dòng)將其去掉。
3、只有輸入有效字符后才將其后面輸入的空白作為分隔符或者結(jié)束符。
next() 不能得到帶有空格的字符串。
Scanner scan = new Scanner(System.in);
?? ??? ?System.out.print("請輸入:");
?? ??? ?String year = scan.next();
?? ??? ?System.out.printf("%s",year);輸入:this is a test
輸出:this
nextInt()
使用nextInt()方法時(shí),與next()方法類似,只是它的返回值是int類型的,依舊將空格看作是兩個(gè)輸入的數(shù)據(jù)的間隔
(當(dāng)使用nexInt()方法時(shí),只能輸入int類型的數(shù)據(jù)。)
nextLine()
1、以Enter為結(jié)束符,也就是說 nextLine()方法返回的是輸入回車之前的所有字符。
2、可以獲得空白。
Scanner scan = new Scanner(System.in);
System.out.print("請輸入:");
String year = scan.nextln();
System.out.printf("%s",year);輸入:this is a test
輸出:this is a test
useDelimiter( )方法
用Scanner.useDelimiter( )方法,可以將分隔符號修改為"回車",或者其他字符。
//useDelimiter("\n"); //“\n”換行符(回車)作為輸入的分隔符
Scanner scan = new Scanner(System.in).useDelimiter("\n");
System.out.print("請輸入:");
String year = scan.next();
System.out.printf("%s",year);輸入:this is a test
輸出:this is a test
注意:
使用nextLine()方法時(shí),不將空格看做是兩個(gè)字符串的間隔,而是看作字符串的一部分,返回時(shí),它作為String類型一并返回
使用next()方法時(shí),將空格看作是兩個(gè)字符串的間隔
使用nextInt()方法時(shí),與next()方法類似,只是它的返回值是int類型的,依舊將空格看作是兩個(gè)輸入的數(shù)據(jù)的間隔(當(dāng)使用nexInt()方法時(shí),只能輸入int類型的數(shù)據(jù)。)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringCloud解決Feign異步回調(diào)問題(SpringBoot+Async+Future實(shí)現(xiàn))
這篇文章主要介紹了SpringCloud解決Feign異步回調(diào)問題(SpringBoot+Async+Future實(shí)現(xiàn)),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
SpringCloud Gateway加載斷言predicates與過濾器filters的源碼分析
這篇文章主要介紹了SpringCloud Gateway加載斷言predicates與過濾器filters的詳細(xì)過程,本文通過源碼給大家解析的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05
Spring?AI?+?ollama?本地搭建聊天?AI?功能
這篇文章主要介紹了Spring?AI?+?ollama?本地搭建聊天?AI?,本文通過實(shí)例圖文相結(jié)合給大家講解的非常詳細(xì),需要的朋友可以參考下2024-11-11
Spring session實(shí)現(xiàn)Session共享
本文主要介紹了Spring session實(shí)現(xiàn)Session共享,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
Java實(shí)現(xiàn)線性表的鏈?zhǔn)酱鎯?chǔ)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)線性表的鏈?zhǔn)酱鎯?chǔ),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10
Spring Boot + Mybatis 實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源案例分析
這篇文章主要介紹了Spring Boot + Mybatis 實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源,需要的朋友可以參考下2018-11-11

