[转载] Java中Scanner用法总结

参考链接: Java之Scanner类

最近在做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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

os和shutil模块

import os //os模块基本实现了linux系统中所有的命令 os.system(终端命令)&#xff1a;在终端执行命令 os.getcwd():获取当前的工作路径 os.chdir():修改工作路径 os.chmod():修改权限 os.chown():修改属主属组 os.mkdir():创建单个目录&#xff0c;当目录存在时报异常&…

[转载] JAVA语言程序设计(基础篇)第十版课后题答案(第一章)

参考链接&#xff1a; Java中的Scanner和nextChar() JAVA语言程序设计&#xff08;基础篇&#xff09;第十版课后题答案 第一章 第二题 /** Created by ysy on 2018/7/6. */ public class text2 { public static void main(String[] args){ for(int i 0; i < 5; i) Syste…

java.util.Date和java.sql.Date 一点区别

最近无意中发现&#xff0c;在oracle中同一样的一个Date类型字段&#xff0c;存储的日期格式有两种不同的情况&#xff0c;第一种是2011-1-1 12:00:00&#xff0c;第二种是2011-1-1&#xff0c;仔细查找发现在向数据库中写数据的时候定义的变量的问题。 第一种是&#xff1a;ja…

[转载] java中关于用\t格式输出

参考链接&#xff1a; 用Java格式化输出 看了好多人关于\t的用法&#xff0c;感觉找不到自己想要的答案&#xff0c;所以索性就自己输出来看看&#xff0c;如图&#xff1a;这样可以一目了然的看出来&#xff0c;\t&#xff08;制表符&#xff09;的作用就是看前面输出满不满8…

微信抢房软件开发

2019独角兽企业重金招聘Python工程师标准>>> 这两年楼市真可谓是一个"火“字难以形容 经历了长沙两次开盘&#xff0c;都没有抢到&#xff0c;目前还没有买到房子&#xff0c;说说我的悲剧吧&#xff0c;让大伙都开心开心 第一次抢房是今年4月份长沙万科金域国…

[转载] Java——数组习题

参考链接&#xff1a; Java从控制台读取输入的方法 package chap02; import java.util.Scanner; /** * * author admin * date 2020-4-8 * description: * 题目内容&#xff1a; 编写程序&#xff0c; 从控制台读取下面的信息&#xff0c; 每月按22天工作日计算&#xff0c;…

超全Linux备份工具集合,满足你的所有需要!

经常备份计算机上的数据是个好的做法&#xff0c;它可以手动完成&#xff0c;也可以设置成自动执行。许多备份工具拥有不同的功能特性&#xff0c;让用户可以配置备份类型、备份时间、备份对象、将备份活动记入日志及执行更多操作。 1.Rsync这是一款在Linux用户当中颇受欢迎的命…

[转载] Java内存管理-你真的理解Java中的数据类型吗(十)

参考链接&#xff1a; Java中的字符串类String 1 做一个积极的人 编码、改bug、提升自己 我有一个乐园&#xff0c;面向编程&#xff0c;春暖花开&#xff01; 推荐阅读 第一季 0、Java的线程安全、单例模式、JVM内存结构等知识梳理 1、Java内存管理-程序运行过程&#x…

Linux系统安全加固脚本

闲来无事&#xff0c;整理一个系统安全加固脚本&#xff0c;每个公司的要求不一样&#xff0c;所以仅供参考&#xff1a; #!/bin/sh echo "00 */1 * * * /usr/sbin/ntpdate 192.168.1.1 >>/var/log/ntpdate.log" > mycrontab crontab mycrontab rm -rf my…

[转载] 整理下java中stringBuilder和stringBuffer两个类的区别

参考链接&#xff1a; Java中的StringBuffer类 StringBuilder和StringBuffer这两个类在动态拼接字符串时常用&#xff0c;肯定比String的效率和开销小&#xff0c;这是因为String的对象不会回收哦。 其实我一直用StringBuilder这个类&#xff0c;因为可以简写为sb的变量在程序…

11.13 模10计数器设计

.新建一个工程 Family&#xff1a;FLEX10K Available device&#xff1a;EPF10K20TC144-3 2.设置lpm_counter宏单元参数并连接引脚 连接引脚的时候要注意的是&#xff0c;向量线的连接。 3.时序仿真 检查无误后进行下一步 4.载入7448并进行引脚连接 5.分配管脚 再次编译&#x…

[转载] java对象在内存中的结构

参考链接&#xff1a; 了解Java中的类和对象 今天看到一个不错的PPT&#xff1a;Build Memory-efficient Java Applications&#xff0c;开篇便提出了一个问题&#xff0c;在Hotspot JVM中&#xff0c;32位机器下&#xff0c;Integer对象的大小是int的几倍&#xff1f; 我们…

使用valueOf前必须进行校验

每个枚举都是java.lang.Enum的子类,都可以访问Enum类提供的方法,比如hashCode(),name(),valueOf()等..... 其中valueOf()方法会把一个String类型的名称转变为枚举项,也就是枚举项中查找出字面值与该参数相等的枚举项,虽然这个方法很简单,但是JDK却做了一个对于开发人员来说并不…

[转载] 【Java】Java基础知识及其扩展笔记(8千字)

参考链接&#xff1a; Java中的StringBuilder类及其示例 Java基础知识及其扩展笔记 零 l 写在前面一 l JVM1、【1.1.2.1】java程序运行的一般流程2、【1.1.2.1】JVM一般运行流程3、【1.1.2.1】JIT&#xff08;just in time 即时编译编译器&#xff09;4、堆与栈 二 l Java …

多IDC GSLB的部署

之前已经介绍过GSLB的实现原理&#xff0c;这里再向大家讲述一下GSLB经常遇到的部署方式&#xff0c;多IDC的部署。很多大型的企业或业务容灾要求非常高的客户都会部署有多个异地的数据中心&#xff0c;以保证其业务的“全天候”不间断的正常运行&#xff0c;而要整合多个IDC的…

[转载] Controller报错:java.lang.NoSuchMethodException: java.util.List.<init>()

参考链接&#xff1a; Java8中的java.util.StringJoiner 报错详情&#xff1a; java.lang.NoSuchMethodException: java.util.List.<init>() 以及 No primary or default constructor found for interface java.util.List 示例&#xff1a; /** * 此接口会产生以…

[转载] 算法竞赛中的JAVA使用笔记

参考链接&#xff1a; Java中StringTokenizer类的示例| 1(构造函数) 算法竞赛中的JAVA使用笔记 算法竞赛中的JAVA使用笔记 输入与输出 基本输入输入挂输出控制台输入输出重定向到文件 大整数与高精度 大整数BigInteger高精度BigDecimal高精度开方 字符串与进制转换 字符串基本…

信息系统开发平台OpenExpressApp:【OpenTest】 之 语法及其使用介绍

在OpenTest 之 运行环境准备中介绍了运行自动化测试需要做的一些准备工作&#xff0c;本篇将继续给大家介绍OpenTest的脚本语法以及使用方法&#xff0c;通过学习后读者应该能够开始动手编写UI自动化测试脚本了。 关键字驱动测试 在学习语法之前&#xff0c;需要了解一下关键字…

[转载] java常量池-字符串常量池、class常量池和运行时常量池

参考链接&#xff1a; 如何在Java中初始化和比较字符串 原文链接&#xff1a;http://tangxman.github.io/2015/07/27/the-difference-of-java-string-pool/ 在java的内存分配中&#xff0c;经常听到很多关于常量池的描述&#xff0c;我开始看的时候也是看的很模糊&#xff0c…

Oracle 10g 高级安装图文教程(二)

第八步&#xff1a;为了简便起见&#xff08;工作中肯定不安全&#xff09;&#xff0c;选择“所有的帐户都是用同一个口令”&#xff0c;并输入口令&#xff0c;点击“下一步”&#xff1a;本文转自 victoryan 51CTO博客&#xff0c;原文链接:http://blog.51cto.com/victoryan…