参考链接: 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

[转载] Java中Scanner用法总结相关推荐

  1. Java中Scanner用法总结

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

  2. java中Scanner用法

    1.导入包,idea可自动导入 import java.util.Scanner; 2.创建一个扫描器对象,用于接收用户输入的数据 Scanner scanner=new Scanner(System ...

  3. 转载java中synchronized用法

    转载自:http://blog.csdn.net/chenguang79/article/details/677720 synchronized的一个简单例子 public class TextThr ...

  4. java中switch用法举例范围_Java中Switch用法代码示例

    一.java当中的switch与C#相比有以下区别 注:在java中switch后的表达式的类型只能为以下几种:byte.short.char.int(在Java1.6中是这样), 在java1.7后 ...

  5. java中import用法

    java中import用法 单类型导入(single-type-import),例如import java.io.File; 按需类型导入(type-import-on-demand),例如 impo ...

  6. java中extends用法_JAVA的extends用法

    理解继承是理解面向对象程序设计的关键.在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类).在Java中不允许多继承. (1)继承 cla ...

  7. java中continue用法

    java中continue用法 有时强迫一个循环提早反复是有用的,也就是,你可能想要继续运行循环,但是要忽略这次重复剩余的循环体的语句,所以 java提供了 continue 语句.continue ...

  8. java中Iterator用法总结

    Java中Iterator用法 迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为"轻量级& ...

  9. java中nextInt()用法

    java中nextInt用法 功能 函数实现 三级目录 功能 给定一个参数n,nextInt(n)将返回一个大于等于0小于n的随机数,即:0 <= nextInt(n) < n. 函数实现 ...

最新文章

  1. NodeJs:用 nodejs + edge + ejs + c#,打造属于自己的代码生成器
  2. C++之全局对象、局部对象、静态对象详解
  3. Linux的前世今生
  4. 先装vs还是先装sql_【家装话题】装修师先装门还是先装地板?
  5. Elasticsearch-日期类型
  6. 两个原生JS跨页面传值的小方法
  7. jroo,已开源,一个java web快速开发工具
  8. Linux操作系统资源 大合集【鸿蒙OS Suse 红帽 BSD CentOS Arch Ubuntu】 | 寻找C站宝藏
  9. excel常用快捷键汇总
  10. ubuntu 18.04.2的初步配置
  11. 微信公众号引流的平台有哪些?
  12. 位运算4 起床困难综合症
  13. 基于F4/F7/H7飞控硬件和px4飞控固件的廉价自主无人机系统(1)-飞控
  14. c语言程序实现进程的管道通信,C 进程间通信--命名管道通信代码实现及其原理图示...
  15. JavaWeb 修炼之路(五)服务器中的请求和响应
  16. NAMD 中计算水分子沿某一放向的平均值 (tcl/tk 脚本输出数据, awk 求某一列平均值)
  17. 蚂蚁金服分布式中间件开源第三弹: 下一代微服务SOFAMesh
  18. .ttf字体文件引入vue项目及使用
  19. 数模学习笔记-层次分析法(AHP)
  20. ESD静电监控看板对工厂防静电设备实时监控和管理

热门文章

  1. 登录界面验证码的实现
  2. C / C++ 之整体知识总结,点进来,不后悔!
  3. C语言(CED)判断一个数是否是2的整数幂的简便方法!
  4. Android Studio------------重要提醒
  5. pojBuy Tickets2828线段树或者树状数组(队列中倒序插队)
  6. linux release 版本的区别,编译debug版本和编译release版本的区别
  7. 获取list泛型_泛型
  8. CV中的色彩空间大全
  9. python discuz_pythonDiscuz发帖器的实现
  10. php如何新建xml文件,PHP中的生成XML文件的4种方法分享