ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【通俗易懂学JAVA】——Scanner对象中hasNext()与next(),nextLine()

2022-01-08 22:59:22  阅读:191  来源: 互联网

标签:nextLine hasNext Scanner next 字符串 sc 输入 out


通俗易懂学JAVA

Scanner对象中hasNext()与next(),nextLine()

一、Scanner

1.1Main类与Scanner
Main类:提交的所有程序都应该有一个Main类,并且必须是声明为public
注:程序中包含多个类:可以将多个类写入一个文件。但只有Main类可以使用public修饰。

class Teacher{
}
public class Main(){
    public static void main(String[] args) {
    }
}

1.2输入与输出
使用Scanner处理输入,程序开头必须import java.util.Scanner导入Scanner类。
使用Scanner sc = new Scanner(System.in);生成scanner对象。
●Scanner sc = new Scanner(System.in); 表示从控制台获取数据
控制台跳出无限循环:按Ctrl+z
该Scanner对象处理标准输入:电脑上标准输入就是你从键盘通过控制台进行的输入。从控制台输入的一个字符串,可以被Scanner对象处理。
标准的程序示例程序

import java.util.Scanner;//导入Scanner类
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);//生成Scanner对象
        while (sc.hasNextInt()) { 
            int a = in.nextInt(); //读下一个整型字符串
            int b = in.nextInt();
            System.out.println(a + b);
        }
        sc.close(); //关闭扫描器,是一个好的习惯
    }
}

Scanner处理输入:
Scanner在处理字符串对象的时候,默认以空格或者回车换行符作为分隔。比如上面一段程序我们
输入 1 2
或者输入
1
2
Scanner均可处理
循环处理输入:
while (sc.hasNextInt())是指,当标准输入的下一个标记是整型则继续处理。
如果输入1 2 3 4 a,那么只能处理前面的1、2、3、4。在处理a时跳出,因为a不是整型字符串。

二、next()与nextLine()

Scanner(扫描器),实现字符串的输入有两种方法,一种是next(),一种nextLine()
1.next()一定要读取到有效字符后才可以结束输入
对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。简单地说,next()查找并返回来自此扫描器的下一个完整标记。完整标记的前后是与分隔模式匹配的输入信息,所以next方法不能得到带空格的字符串。
2.nextLine()方法的结束符只是Enter键,
nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。
<举例>输入一行:abc def ghi
其中abc和def之间有空格,def和ghi之间也有空格
所以next()返回的是abc,而nexLine()返回的是整行:abc def ghi

输入abc def ghi
next()返回abc
nexLine()返回abc def ghi

三、hasNext()与next()

hasNext() :返回true或false,看有无下一个标记(字符串类型)。比如a b c,现在处理到a,下一个标记就是b
next():返回类型String(字符串),返回下一个标记。不会读取回车换行

四、Scanner对象常用方法总结

Scanner对象常用方法返回
hasNext()返回true或false,看有无下一个标记(字符串类型)。比如a b c,现在处理到a,下一个标记就是b
next()返回类型String(字符串),返回下一个标记。不会读取回车换行
hasNextInt()返回true或false,看有无下一个整型字符串标记
nextInt()返回类型int,将下一个整型字符串标记转化为int型返回
nextBoolean()返回类型boolean,可以处理字符串true或者false
nextDouble()返回类型double,可以处理字符串如1 2.3 -1.3等
nextLine()返回类型String(字符串对象),返回一整行。会读取回车换行符

五、next()和nexline()的结束符过滤问题

//程序1
import port java.util.scanner;  
public class nexttest{  
    public static void main(string[] args) {  
        string s1,s2;  
        scanner sc=new scanner(system.in);  
        system.out.print("请输入第一个字符串:");  
        s1=sc.nextline();  
        system.out.print("请输入第二个字符串:");  
        s2=sc.next();  
        system.out.println("输入的字符串是:"+s1+" "+s2);  
    }  
}  

运行结果:
请输入第一个字符串:hello
请输入第二个字符串:world
输入的字符串是:hello world

//程序2
import port java.util.scanner;  
public class nexttest{  
    public static void main(string[] args) {  
        string s1,s2;  
        scanner sc=new scanner(system.in);  
        system.out.print("请输入第一个字符串:");  
        s1=sc.next();  
        system.out.print("请输入第二个字符串:");  
        s2=sc.nextline();  
        system.out.println("输入的字符串是:"+s1+" "+s2);  
    }  
}  

运行结果是:
请输入第一个字符串:hello
请输入第二个字符串:输入的字符串是:hello
可以看到,nextline()自动读取了被next()去掉的enter作为他的结束符,所以没办法给s2从键盘输入值。经过验证,其他的next的方法,如double nextdouble() , float nextfloat() , int nextint() 等与nextline()连用时都存在这个问题,解决的办法是:在每一个 next()、nextdouble() 、 nextfloat()、nextint() 等语句之后加一个nextline()语句,将被next()去掉的enter结束符过滤掉。

//程序3
import port java.util.scanner;  
public class nexttest{  
   public static void main(string[] args) {  
       string s1,s2;  
       scanner sc=new scanner(system.in);  
       system.out.print("请输入第一个字符串:");  
       s1=sc.next();  
       sc.nextline();  
       system.out.print("请输入第二个字符串:");  
       s2=sc.nextline();  
       system.out.println("输入的字符串是:"+s1+" "+s2);  
   }  
}  

运行结果是:
请输入第一个字符串:hello
请输入第二个字符串:world
输入的字符串是:hello world

六、Scanner对象其他问题

1.字符串转化为整型
常用处理代码

String str = sc.nextLine();
int numStu = Integer.parseInt(str); 

也可以使用Double.parseDouble处理double类型数据,还有Long, Boolean等对象均有相似方法。
2.nextLine的坑

for (int i = 0; i < 3; i++) {           
    int x = sc.nextInt();
    String str = sc.nextLine();
    System.out.println("x="+x+" str="+str);
}

当我们输入1并按回车的时候,就直接输出x=1 str=。可以看到sc.nextLine()并没有读取到任何东西。
实际上它读取去了回车换行符。我们应将其改为sc.next()。
3.重复创建Scanner对象

for (int i = 0; i < 3; i++) { 
    Scanner sc = new Scanner(System.in);//没有必要重复创建Scanner对象!运行时会导致结果不正确。
    int x = sc.nextInt();
    String str = sc.nextLine();
    System.out.println("x="+x+" str="+str);
}

这是一个非常典型的错误!!!
应将Scanner sc = new Scanner(System.in);移到for循环外。
4.输出
System.out.println打印字符串并回车换行。可以使用使用+号连接各个类型的变量。

int x = 1;
String str = "abc";
System.out.println(x+"-"+str); //输出1-abc,即可以使用+连接各个类型的变量。

System.out.print打印字符串,不打印回车换行。
格式化输出:

System.out.printf("%d,%f,%s,%b\n",1,2.3,"abc",true)输出1,2.300000,abc,true

5.动态创建数组与ArrayList
有的时候需要动态创建一个数组来存放输入的数据。

int n = sc.nextInt();
int arr = new int[n];//动态创建大小为n的数组
for(int i = 0; i < n; i++){
    arr[i] = sc.nextInt();
}

如果待输入的数据不确定,无法一开始就确定数组的大小。我们可以使用ArrayList。

List<String> strList = new ArrayList<String>();
while(sc.hasNextLine()){
    strList.add(sc.nextLine());
}
/*遍历输出列表中的内容*/
for (int i = 0; i < strList.size(); i++) {
    String str = strList.get(i);
    System.out.println(str);
}

标签:nextLine,hasNext,Scanner,next,字符串,sc,输入,out
来源: https://blog.csdn.net/m0_47646824/article/details/122386735

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有