next()
和nextLine()
之间的主要区别是什么?
我的主要目标是使用Scanner
来阅读所有文字,{{1}}可以“连接”到任何来源(例如文件)。
我应该选择哪一个?为什么?
答案 0 :(得分:64)
我总是喜欢使用nextLine()
读取输入,然后解析字符串。
使用next()
只会返回空格之前的内容。返回当前行后,nextLine()
会自动将扫描仪向下移动。
用于解析nextLine()
数据的有用工具是str.split("\\s+")
。
String data = scanner.nextLine();
String[] pieces = data.split("\\s+");
// Parse the pieces
有关Scanner类或String类的更多信息,请参阅以下链接。
扫描仪:http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html
字符串:http://docs.oracle.com/javase/7/docs/api/java/lang/String.html
答案 1 :(得分:35)
next()
只能读取输入直到空格。它不能读取由空格分隔的两个单词。此外,next()
在读取输入后将光标放在同一行。
nextLine()
读取包含单词之间空格的输入(即,它读取到行\n
的末尾)。读取输入后,nextLine()
将光标定位在下一行。
要阅读整行,您可以使用nextLine()
。
答案 2 :(得分:15)
来自JavaDoc:
Scanner
使用分隔符模式将其输入分解为标记,分隔符模式默认匹配空格。next()
:从此扫描仪中查找并返回下一个完整令牌。nextLine()
:使此扫描程序超过当前行,并返回跳过的输入。
因此,如果"small example<eol>text"
next()
应返回“小”,nextLine()
应返回“小例子”
答案 3 :(得分:7)
我注意到除了next()之外只扫描到空间,而nextLine()扫描整行,下一个等待直到它获得完整的令牌,其中 nextLine()不等待完整的令牌,当获得'\ n'时(即当您按下回车键时)扫描仪光标移动到下一行并返回上一行被跳过。它不会检查您是否已经给出了完整的输入,即使它将采用空字符串,其中next()不采用空字符串
public class ScannerTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int cases = sc.nextInt();
String []str = new String[cases];
for(int i=0;i<cases;i++){
str[i]=sc.next();
}
}
}
通过更改for循环中的next()和nextLine()来尝试此程序,继续按'\ n'即输入键而不进行任何输入,您可以使用 nextLine()方法终止< / strong>在按下给定数量的情况后, next()不终止,直到您为给定数量的案例提供并输入。
答案 4 :(得分:4)
对于这个问题,关键是找到方法停止的位置以及调用方法后光标的位置。所有方法都将读取光标位置和下一个默认分隔符之间的信息(不包括空格)(空格,制表符,\ n - 按Enter键创建),光标在分隔符之前停止,但nextLine()除外读取光标位置和\ n之间的信息(包括由分隔符创建的空格),光标停在\ n后面。
例如: (|表示当前光标位置; _代表空白; 流粗体通过调用方法得到的信息)
23_24_25_26_27 \ n
调用nextInt();阅读 23 | _24_25_26_27 \ n
调用nextDouble();阅读23_ 24 | _25_26_27 \ n
调用next();阅读23_24_ 25 | _26_27 \ n
调用nextLine();阅读23_24_25 _26_27 \ n |
在此之后,应根据您的要求调用该方法。
答案 5 :(得分:2)
来自javadocs
next()如果匹配从指定字符串构造的模式,则返回下一个标记。 nextLine()使此扫描器前进超过当前行并返回跳过的输入。
您选择哪一个取决于哪个最适合您的需求。如果是我阅读整个文件,我会选择nextLine,直到我拥有所有文件。
答案 6 :(得分:2)
简而言之:如果您输入长度为t的字符串数组,则Scanner#nextLine()需要t行,字符串数组中的每个条目都通过输入键区别于另一个。并且扫描程序#next()将保留在输入之前输入输入,但在数组中存储字符串(字),用空格分隔。
让我们看看以下代码片段
Scanner in = new Scanner(System.in);
int t = in.nextInt();
String[] s = new String[t];
for (int i = 0; i < t; i++) {
s[i] = in.next();
}
当我在我的IDE中运行上面的代码片段时(假设字符串长度为2),我是否输入我的字符串并不重要
输入为: - abcd abcd或
输入为: -
ABCD
abcd
输出就像 ABCD
ABCD
但是如果在相同的代码中我们用nextLine()
替换next()方法 Scanner in = new Scanner(System.in);
int t = in.nextInt();
String[] s = new String[t];
for (int i = 0; i < t; i++) {
s[i] = in.nextLine();
}
然后,如果您在提示符下输入输入 - abcd abcd
输出是: -
abcd abcd
如果你输入提示输入为 abcd(如果按Enter键进入另一行的下一个abcd,输入提示将退出,你将获得输出)
输出是: -
abcd
答案 7 :(得分:1)
答案 8 :(得分:1)
next()和nextLine()方法与Scanner相关联,用于获取String输入。他们的不同之处在于......
next()只能读取输入直到空格。它无法读取由空格分隔的两个单词。此外,next()在读取输入后将光标放在同一行。
nextLine()读取包含单词之间空格的输入(即,读取直到行尾\ n)。读取输入后,nextLine()将光标定位在下一行。
import java.util.Scanner;
public class temp
{
public static void main(String arg[])
{
Scanner sc=new Scanner(System.in);
System.out.println("enter string for c");
String c=sc.next();
System.out.println("c is "+c);
System.out.println("enter string for d");
String d=sc.next();
System.out.println("d is "+d);
}
}
输出:
输入c的字符串
abc def
c是abc
输入d
的字符串d是def
如果使用nextLine()而不是next(),那么
输出:
输入c
的字符串 ABC DEF
c是ABC DEF
输入d
GHI
d是GHI
答案 9 :(得分:1)
仅用于Scanner.next()和nextLine()的另一个示例,如下所示: nextLine()不允许用户输入,而next()使Scanner等待并读取输入。
Scanner sc = new Scanner(System.in);
do {
System.out.println("The values on dice are :");
for(int i = 0; i < n; i++) {
System.out.println(ran.nextInt(6) + 1);
}
System.out.println("Continue : yes or no");
} while(sc.next().equals("yes"));
// while(sc.nextLine().equals("yes"));
答案 10 :(得分:1)
扫描程序使用分隔符模式将其输入分解为标记,默认情况下称为空格。
下一个()用于读取单个单词,当它获得空白时,它会停止读取并将光标恢复到原始位置。 NextLine(),即使它遇到空格,也会读取整个单词。当光标完成读取并且光标返回到行尾时,光标会停止。 所以当你想要将一个完整的单词作为一个句子阅读时,你不需要使用 delimeter 。你只需要使用NextLine()。
public static void main(String[] args) {
// TODO code application logic here
String str;
Scanner input = new Scanner( System.in );
str=input.nextLine();
System.out.println(str);
}
答案 11 :(得分:1)
这两个功能均用于移至下一个扫描仪令牌。
区别在于扫描器令牌的生成方式
next()使用定界符作为空白
生成扫描仪令牌nextLine()使用定界符作为'\ n'生成扫描仪令牌(即,输入 按键)
答案 12 :(得分:0)
我也遇到了有关分隔符的问题。 问题是关于
的输入问题
解决方案
我使用分隔符作为扫描仪并成功运行。
示例
public static void main (String args[]){
//Initialize the Scanner this way so that it delimits input using a new line character.
Scanner s = new Scanner(System.in).useDelimiter("\n");
System.out.println("Enter Your Name: ");
String name = s.next();
System.out.println("Enter Your Age: ");
int age = s.nextInt();
System.out.println("Enter Your E-mail: ");
String email = s.next();
System.out.println("Enter Your Address: ");
String address = s.next();
System.out.println("Name: "+name);
System.out.println("Age: "+age);
System.out.println("E-mail: "+email);
System.out.println("Address: "+address);
}
答案 13 :(得分:0)
基本区别是next()用于获取输入直到遇到定界符(默认情况下为空白,但您也可以更改它)并返回您输入的令牌。然后光标停留在同一行。而在nextLine()中,它将扫描输入,直到我们按下Enter键并返回整个内容并将光标放在下一行中。 **
Scanner sc=new Scanner(System.in);
String s[]=new String[2];
for(int i=0;i<2;i++){
s[i]=sc.next();
}
for(int j=0;j<2;j++)
{
System.out.println("The string at position "+j+ " is "+s[j]);
}
**
尝试通过将Input输入为“ Hello World”来运行此代码。扫描程序将读取输入直到“ o”,然后出现定界符。因此s [0]将为“ Hello”,并且光标将指向下一个位置在定界符之后(在我们的例子中为'W'),并且在读取s [1]时,它将扫描“世界”并将其返回给s [1]作为下一个完整标记(根据Scanner的定义)。如果我们使用nextLine()相反,它将完全读取“ Hello World”,并且还会读取更多内容,直到我们按下enter按钮并将其存储在s [0]中为止。 我们也可以使用nextLine()给出另一个字符串。我建议您尝试使用此示例以及更多示例,并要求进行任何澄清。
答案 14 :(得分:0)
通过下面的代码及其输出可以很明显地看出区别。
public static void main(String[] args) {
List<String> arrayList = new ArrayList<>();
List<String> arrayList2 = new ArrayList<>();
Scanner input = new Scanner(System.in);
String product = input.next();
while(!product.equalsIgnoreCase("q")) {
arrayList.add(product);
product = input.next();
}
System.out.println("You wrote the following products \n");
for (String naam : arrayList) {
System.out.println(naam);
}
product = input.nextLine();
System.out.println("Enter a product");
while (!product.equalsIgnoreCase("q")) {
arrayList2.add(product);
System.out.println("Enter a product");
product = input.nextLine();
}
System.out.println();
System.out.println();
System.out.println();
System.out.println();
System.out.println("You wrote the following products \n");
for (String naam : arrayList2) {
System.out.println(naam);
}
}
输出:
Enter a product
aaa aaa
Enter a product
Enter a product
bb
Enter a product
ccc cccc ccccc
Enter a product
Enter a product
Enter a product
q
You wrote the following products
aaa
aaa
bb
ccc
cccc
ccccc
Enter a product
Enter a product
aaaa aaaa aaaa
Enter a product
bb
Enter a product
q
You wrote the following products
aaaa aaaa aaaa
bb
很清楚,默认的分隔符空格是在使用next时将空格分隔的产品添加到列表中,因此每次在一行中输入空格分隔的字符串时,它们都是不同的字符串。 对于nextLine,空格没有意义,整行是一个字符串。