Java中Scanner用法总结

Java中Scanner用法总结最近在做OJ类问题的时候,经常由于Scanner的使用造成一些细节问题导致程序不通过(最惨的就是网易笔试,由于sc死循环了也没发现,导致AC代码也不能通过。。。),因此对Scanner进行了一些总结整理。Scanner类简介Java5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序。它是以前的StringTokenizer和Matcher类之间的某种结合。由于任何

大家好,又见面了,我是你们的朋友全栈君。

最近在做OJ类问题的时候,经常由于Scanner的使用造成一些细节问题导致程序不通过(最惨的就是网易笔试,由于sc死循环了也没发现,导致AC代码也不能通过。。。),因此对Scanner进行了一些总结整理。(我的github:https://github.com/MonkeyJJC?tab=repositories)

Scanner类简介

Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序。它是以前的StringTokenizer和Matcher类之间的某种结合。由于任何数据都必须通过同一模式的捕获组检索或通过使用一个索引来检索文本的各个部分。于是可以结合使用正则表达式和从输入流中检索特定类型数据项的方法。这样,除了能使用正则表达式之外,Scanner类还可以任意地对字符串和基本类型(如int和double)的数据进行分析。借助于Scanner,可以针对任何要处理的文本内容编写自定义的语法分析器。

关于nextInt()、next()和nextLine()的理解

nextInt(): it only reads the int value, nextInt() places the cursor(光标) in the same line after reading the input.(nextInt()只读取数值,剩下”\n”还没有读取,并将cursor放在本行中)

next(): read the input only till the space. It can’t read two words separated by space. Also, next() places the cursor in the same line after reading the input.(next()只读空格之前的数据,并且cursor指向本行)
next() 方法遇见第一个有效字符(非空格,非换行符)时,开始扫描,当遇见第一个分隔符或结束符(空格或换行符)时,结束扫描,获取扫描到的内容,即获得第一个扫描到的不含空格、换行符的单个字符串。

nextLine(): reads input including space between the words (that is, it reads till the end of line \n). Once the input is read, nextLine() positions the cursor in the next line.
nextLine()时,则可以扫描到一行内容并作为一个字符串而被获取到。

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);  
    }  
}  

结果:

请输入第一个字符串:home
请输入第二个字符串:work
输入的字符串是:home work

把上面的程序修改一下:

s1=sc.next();  
s2=sc.nextLine();  

运行结果:

请输入第一个字符串:home
请输入第二个字符串:输入的字符串是:home

可以看到,nextLine()自动读取了被next()去掉的Enter作为他的结束符,所以没办法给s2从键盘输入值。经过验证,我发现其他的next的方法,如double nextDouble() , float nextFloat() , int nextInt() 等与nextLine()连用时都存在这个问题,解决的办法是:在每一个 next()、nextDouble() 、 nextFloat()、nextInt() 等语句之后加一个nextLine()语句,将被next()去掉的Enter结束符过滤掉

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);  
    }  
}  

运行结果:

请输入第一个字符串:home
请输入第二个字符串:work
输入的字符串是:home work

循环输入多组测试用例

一个while就是一个测试用例

    public static void main(String[] args){
        Scanner in = new Scanner(System.in);

        // 一个while就是一个测试用例
        while(in.hasNext()){
            int n = in.nextInt(); // 该测试用例后续接收的参数个数
            long[] array = new long[n];
            String[] arrayStr = new String[n];
            for(int i=0; i<n; i++){
                arrayStr[i] = in.next();
            }
            for(int i=0; i<n; i++){
                array[i] = in.nextLong();// 取下一个元素转换成long类型
            }

            System.out.println(Arrays.toString(array)+" "+ Arrays.toString(arrayStr));
        }
    }

一个与容器结合的综合例子:

import java.util.Scanner;    
public class Main {    
    public static void main(String[] args) {    
        Scanner in = new Scanner(System.in);    
        while (in.hasNext()) {    
            int n = in.nextInt();   
        /* nextLine()是扫描器执行当前行,并返回跳过的输入信息,特别需要注意!!! 
 
            如果没有该行,则执行第一个in.nextLine()命令时的返回值是int n = in.nextInt()的值*/   
            in.nextLine();  
        HashSet<String> set = new HashSet<String>();  
        for (int i = 0; i < n; i++) {   
        String line =   
  
        in.nextLine();   
        String[] arr = line.split(" ");   
        for (int j = 0; j < arr.length; j++) {   
            set.add(arr[j]);   
        }  
         }  
        System.out.println("sum:" + set.size());    
    
    }    
}  

输入:
3
a b c
d e f
a b c
输出:
6

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162041.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • hive sql和sql的区别是什么_hives

    hive sql和sql的区别是什么_hives区别:1、Hive-sql不支持等值连接,而sql支持;2、Hive-sql不支持“Insertinto表Values()”、UPDATA、DELETE操作,而sql支持;3、Hive-sql不支持事务,而sql支持。总体来说hiveSQL与SQL基本上一致,最初的设计目的就是为了让会SQL但是不会编程MapReduce的人也能使用Hadoop进行数据处理。1、Hive不支持等值连接不支持等…

    2022年9月27日
    3
  • linux进程管理工具_进程管理系统的目标

    linux进程管理工具_进程管理系统的目标引言:    在Linux的内核的五大组成模块中,进程管理模块时非常重要的一部分,它虽然不像内存管理、虚拟文件系统等模块那样复杂,也不像进程间通信模块那样条理化,但作为五大内核模块之一,进程管理对我们理解内核的运作、对于我们以后的编程非常重要。同时,作为五大组成模块中的核心模块,它与其他四个模块都有联系。下面就对进程模块进行想写的介绍,首先要了解进程及其相关的概念。其次介

    2022年9月11日
    4
  • java编程_郑州java编程入门培训「建议收藏」

    java编程_郑州java编程入门培训「建议收藏」郑州java培训机构如何选择? 在选择java培训机构之前,必须进行大量的比较,然后才能决定去哪家培训机构。而现在千锋教育的Java实验班可以帮测试你是否适合学习Java。你可以找个机会去看看。要想学好java,就必须选择好的java培训机构,千锋的教育很好。口碑很重要,好的口碑是学生的真实的评价,这样的学校很靠谱。好的it培训学校有很好的老师指导学生学习,好的老师是学生学习路上的灯塔。选择…

    2022年7月8日
    18
  • 怎么转换成html格式_html怎么转换成http

    怎么转换成html格式_html怎么转换成http工作中有些时候,领导下达指令需要将html格式的内容转换成Word格式的文档,对于很多新手来说,就着实不知道该如何下手了,如果是一个一个转换的话,内容过多就很艰难,而且十分耽误工作效率,那么html该怎么转换成word呢?方法一:1.首先在桌面新建一个空白的Word文档并打开。2.找到需要转换的HTML文件,可以看到该文件即为HTML格式。3.点击Word左上角的文件标志,选择打开按钮,找到HTM…

    2022年10月11日
    1
  • Quadro P5200 – 最强大的移动工作站显卡 专门为了惠普 VR Z 背包电脑而发布

    Quadro P5200 – 最强大的移动工作站显卡 专门为了惠普 VR Z 背包电脑而发布https://www.leiphone.com/news/201708/Z1MCetuoobEaHIqa.html前言在今年的计算机图形技术顶会SIGGRAPH,英伟达并不是在单纯地展示自家的

    2022年8月6日
    24
  • 谷歌地图 ftp_谷歌地图离线地图包

    谷歌地图 ftp_谷歌地图离线地图包1.3GB的谷歌离线地图包安装使用与下载:MapsV4.5.0以前的版本安装方法: 1、谷歌地图软件要下载经国外高手brut修改过的带brut字样的版本如Google.Maps.v4.4.0.4414-brut16.apk 2、将下载的谷歌离线地图包解压到SD卡根目录下的\brut.googlemaps文件夹中 3、打开地图软件,点菜单进更多,在高级设置里勾

    2022年9月14日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号