Java中使用Scanner获取含空格字符串及字符串列表的问题求助
解决Scanner获取字符串后无法正确读取多单词列表的问题
你碰到的这个问题其实是Scanner.next()和Scanner.nextLine()的行为差异在搞鬼,我给你拆解清楚并提供几种实用的解决方案:
问题根源
next()方法只会读取到**第一个空白字符(空格、换行、制表符都行)**就停,而且不会消耗掉后面的换行符,会把它留在输入缓冲区里。nextLine()则是读取从当前位置到换行符的所有内容,同时会把这个换行符消耗掉。
所以当你用next()读完第一个名字后,缓冲区里还留着你输完名字按回车的那个换行符,这时候直接调用nextLine(),它会先把这个空的换行内容读走,根本不会去读你后面输入的名字列表,这就是为啥你拿不到正确内容的原因。
方案1:读取整行多单词作为列表元素
如果你需要把输入的一整行多单词内容(比如"Alice Bob Charlie")拆成单个名字存入列表,可以这么做:
import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("Enter a name:"); String name = input.next(); // 关键步骤:把next()留下的换行符清掉 input.nextLine(); System.out.println("Enter a name list (multiple words allowed):"); String nameListLine = input.nextLine(); // 把整行按任意空白字符拆分(多个空格也能正确识别) ArrayList<String> nameList = new ArrayList<>(); for (String nameItem : nameListLine.split("\\s+")) { nameList.add(nameItem); } // 测试输出 System.out.println("Single name: " + name); System.out.println("Name list items:"); for (String item : nameList) { System.out.println("- " + item); } input.close(); } }
方案2:读取多行输入作为列表
如果你的需求是每行输入一个名字,直到输入特定结束符(比如输入exit停止),同样要先处理掉残留的换行符:
import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("Enter a name:"); String name = input.next(); input.nextLine(); // 清空换行符 System.out.println("Enter name list (enter 'exit' to stop):"); ArrayList<String> nameList = new ArrayList<>(); while (true) { String line = input.nextLine(); if (line.equalsIgnoreCase("exit")) { break; } // 如果每行允许输入多个单词,也可以拆分后加入列表 // nameList.addAll(Arrays.asList(line.split("\\s+"))); nameList.add(line); } // 测试输出 System.out.println("Single name: " + name); System.out.println("Name list:"); for (String item : nameList) { System.out.println("- " + item); } input.close(); } }
额外小技巧:全程用nextLine()避免麻烦
如果第一个名字也允许带空格(比如"Mary Ann"),其实更简单的方式是全程用nextLine()读取,这样就不会有缓冲区残留的问题了:
import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("Enter a name (can have spaces):"); String name = input.nextLine(); System.out.println("Enter a name list (multiple words per line allowed):"); String nameListLine = input.nextLine(); ArrayList<String> nameList = new ArrayList<>(); for (String item : nameListLine.split("\\s+")) { nameList.add(item); } // 输出结果 System.out.println("Name: " + name); System.out.println("Name list: " + nameList); input.close(); } }
内容的提问来源于stack exchange,提问作者Stéphane GRILLON
相关产品推荐
相关产品推荐

