Java刷题常用API(一)———— Scanner从屏幕读入数据(待补充)

Java彩票模拟:HashSet、ThreadLocalRandom与Scanner深度实践 Java集合框架中的HashSet提供O(1)平均时间复杂度的去重能力,其底层哈希表机制依赖hashCode与equals契约,是实现‘不重复随机数’约束的最优选择;伪随机数生成器如ThreadLocalRandom通过线程局部种子规避并发碰撞,显著优于传统Random实例;而Scanner作为标准输入门面,需警惕缓冲区残留、资源泄漏及非法输入校验等常见陷阱。三者协同构成Java基础能力的压力测试场,广泛应用于抽奖系统、测试数据生成、风控规则模拟等工程场景。本文以9个100~999区间不重复随机数生成为切口 阅读详情

目录

1)Scanner类位置

2)Scanner.next()使用:

① next() 方法默认的token分隔符(delimiter)为 “空格、回车和tab”

② 如果输入的第一个字符就是分隔符(空格、回车和tab),则会“忽略”:

③ 方法第三点的说明:阻塞问题(待补充)

④ 可以使用Scanner.useDelimiter()指定特定的String作为分隔符

⑤ nextXXX()方法(待补充)

3)Scanner.hasNext()

利用while(hasNext())处理多个测试样例时,注意全局变量的初始化

4)nextLine()

nextXXX()nextLine()合用的问题


1)Scanner类位置

Scanner是java.util包下的final类,不在java.lang包下:

要使用时须主动import(特别在刷题时)。

2)Scanner.next()使用:

方法说明:

大意:

  • 从当前Scanner发现和返回下一个完整的token

  • 完整的token前面和后面都是由特定pattern的分隔符(delimiter)隔开的

  • 即使之前调用的hasNext()方法已经返回了true值,next()方法仍有可能在扫描输入时被阻塞

 

结合例子和方法说明,即next()方法会一个一个读入token(来自于屏幕,文件等等),不同token之间由分隔符(delimiter)隔开。

需要注意的是:

① next() 方法默认的token分隔符(delimiter)为 “空格、回车和tab”

和C/C++的 Scanf()一个个读入变量并赋值的分隔符是一样的,e.g:

回车做分隔符:

Tab做分隔符:

(空格作分隔符就是第一个例子,不需举例)

② 如果输入的第一个字符就是分隔符(空格、回车和tab),则会“忽略”:

关于token —— A complete token is preceded and followed by input that matches the delimiter pattern.即完整的token前面和后面都是由特定pattern的分隔符(delimiter)隔开的,根据输入的第一个字符是不是分隔符,可以分为两种情况:

  • 第一个不是分隔符,就是正常字符,则默认为前面有个“虚拟的分隔符”,next()会读入第一个字符到第一个分隔符之间的所有内容作为a complete token,虽然此token“前面“并没有分隔符;
  • 第一个是分隔符,则next()正常工作。

 

③ 方法第三点的说明:阻塞问题(待补充)

方法说明的第三点:即使之前调用的hasNext()方法已经返回了true值,next()方法仍有可能在扫描输入时被阻塞

可以看下面的例子:

 

 

 

 

④ 可以使用Scanner.useDelimiter()指定特定的String作为分隔符

e.g

 

⑤ nextXXX()方法(待补充)

除了可以使用useDelimiter()来指定特定的delimiter外,也可以使用nextXXX()来筛选不同已经得到的token,达到“获取特定分隔符下的特定字符”的目的,nextXXX()有一下几种(基于jdk1.8):

可以看到,除了八大基本类型外,还有提供了BigDecimal,BigInteger的筛选,其中整数类型提供了附加的带参next方法:nextByte(int),nextShort(int),nextInt(int i),nextLong(int),nextBigInteger(int),这个参数是:

这个是指定进制的,如:

并且有一个nextLine()方法,这个方法将在后面详细介绍。

 

3)Scanner.hasNext()

hasNext()方法,hasNextXXX()方法与next(),nextXXX()方法是对应的:

翻看hasNext()方法说明:

  • 如果本scanner(指正在运行的这个实例即this)的输入中有此token(基于默认或者设置的delimiter),则返回true,否则false,并且此方法可能在等到扫描输入时被阻塞。

其余的hasNextXXX()方法同理。

但是有一点要注意:

利用while(hasNext())处理多个测试样例时,注意全局变量的初始化

用

处理就好,牛客网上给的范例一般都是这样。

但是有一点特别注意,这样使用的全局变量在while开头一定要进行初始化,不然上一个用例的结果必然会影响这一次的答案。(吃过亏!!!)

 

4)nextLine()

  • 将此scanner推进到当前行之后(past the current) ,返回中间跳过的输入——— 即换行后,并返回上一次光标所在位置到上一行末尾的内容。(之所以不用“返回上一行”,因为上一次扫描的位置可能不在行头)               
  • 此方法返回当前行的剩余部分,不包括任何行末的行分隔符。新的扫描位置设置为下一行的开头                           
  • 因为此方法会持续在输入中查找行分隔符,如果没有行分隔符出现的话,它可能会缓冲所有的输入并跳过(以寻找行分隔符)。

很明显了,nextLine()是截取当前光标到当前行末尾(不包括行分隔符)的内容,并将光标移到下一行开头。

实验:

类似于之前的next()和hasNext()方法的对比,nextLine()也有对应的hasNextLine()方法与之对应

 

nextXXX()nextLine()合用的问题

应该特别引起注意的是,Scanner.next()方法和Scanner.nextLine()方法合用时的问题,先看下面的例子:

或者:

按说

这一句接收了“5”,接下来:

不应该接收了456256吗?为什么接收了一个空的输入,然后才接收456256呢。可以回看next()方法(nextInt()和所有nextXXX()的实现都是next()方法,只是对得到Token进行了再判断而已)和nextLine()方法说明:

next()方法:

  • 从当前Scanner发现和返回下一个完整的token

  • 完整的token前面和后面都是由特定pattern的分隔符(delimiter)隔开的

即next()方法是将输入用delimeter(空格,回车和Tab)切割成一个一个Token,返回第一个。

而nextLine()方法:

  • 将此scanner推进到当前行之后(past the current) ,返回中间跳过的输入——— 即换行后,并返回上一次光标所

位置到上一行末尾的内容。(之所以不用“返回上一行”,因为上一次扫描的位置可能不在行头)

可以看到,nextLine()是返回当前光标位置到行末的内容,然后将光标换行到下一行开头,问题就出在这,再看上例的输入:

从输出结果来看(只能这么分析了),检测到5后面的回车键(\n)后,将Token返回,此时光标没有移到下一行(就是读到了'\n'而已),而是在回车符前面,类似于这样|\n,当执行scan.nextLine()时,从当前光标处读到下一行(其实它的实现是从当前光标处读到下一个换行符处(回车键),skip掉这一段),当然就是一个空的字符串了——|和\n之间上面都没有。

为了验证,看下面代码:

int i = scan.nextInt()之后,光标位于\n之前,使用scan.useDelimiter(" ")使scan,next()能够接收回车键,然后使用next()将回车接收放入after5中,打印出来验证——果然,换行了(真的换行了。。。。开始以为怎么看到回车效果??)。Dubug一样能看到:

分析完原因之后,现在来看怎么解决这个问题。

一方面,应该尽量避免nextXXX后使用nextLine()(明显,反之是可以的),可以全部使用nextLine()处理,这样能保证肯定都是按行处理,光标永远都是在每一行的头部。代价就是明明很简单的事情(如 int i = scan.nextInt())只能通过nextLine()接收,再从字符串中(nextLine()返回值是String)提取。

另一方面,对症下药,既然nextInt()后光标在行尾的\n前面,那么我们可以单独使用一个nextLine()“吃掉”这个回车,像这样:

 

 

 

 

 

前端监控性能指标 文章目录前端监控性能指标性能指标阶段性指标关键性能指标小程序W3C Level 1兼容性常规用法注意事项1、计算HTML文档请求使用 Nav Timing2、计算静态资源使用 getEntriesByType('resource') 代替 getEntries()3、secureConnectionStart 问题4、跨域资源设置响应头 Timing-Allow-Origin5、注意属性值为 0 ... 阅读详情

相关推荐

metaRTC嵌入式webrtc编译指南

metaRTC编译支持qmake和cmake,qmake使用QT最为方便,新版本新增了cmake支持。 ...

metaRTC的博客 9518

Scanner刷题常用

Java刷题常用API(一)———— Scanner从屏幕读入数据(待补充) https://blog.youkuaiyun.com/ProLayman/article/details/89103252

weixin_46356409的博客 164

PointNet/PointNet++模型调参实战:如何用PyTorch让你的点云分割精度再涨5个点?

本文深入探讨了PointNet/PointNet++模型在点云分割中的调参技巧,通过PyTorch实现精度提升5个点的实战方法。重点分析了点云密度自适应策略、感受野与细节保留的平衡,以及训练加速与稳定性技巧,适用于电力巡检、自动驾驶等场景的激光点云数据处理。

weixin_30836759的博客 476

菜鸟文科生的Java之路:Scanner 练习

01scanner Scanner是面向对象的一个模块,需要引入 在第二行输入如图: 注意:import java.util.Scanner; 注意: Scanner input = new Scanner(System.in);//创建Scanner对象 知识点:二重循环、外层循环控制班级的数量、内层循环控制每个班级的学生数量 内循环累加输入的分数时,完成一次循环后, 外循环要把上一次内循环...

北海糖的博客 266

LVGL在嵌入式Linux系统上的高效移植与优化实践

本文详细介绍了在嵌入式Linux系统(特别是ARM平台)上移植和优化LVGL图形库的完整实践流程。内容涵盖从开发环境搭建、代码获取、CMake工程配置,到关键配置文件定制、显示与输入设备端口移植,以及内存、渲染等核心性能优化技巧,旨在帮助开发者高效构建流畅的嵌入式UI应用。

weixin_29274969的博客 450

超速U盘选购避坑指南:如何通过Rx Detect机制识别真伪USB3.0设备

本文深入解析了USB 3.0超速U盘的选购避坑要点,重点介绍了通过Rx Detect机制识别真伪设备的核心原理。文章提供了从软件检测到实际性能测试的完整方案,帮助消费者和技术人员有效辨别虚假的USB3.0设备,确保获得真正的超速传输体验。

weixin_29189373的博客 443

Java中scanner输入字符串next()和nextLine()比较

Java scanner类的next()和nextline()的区别

m0_52882191的博客 468

Python速成指南:进阶篇

欢迎来到Python速成指南的进阶篇。如果你已经完成了基础篇的学习(Python速成指南:从零开始的编程之旅-优快云博客),并且对Python的基本概念有了扎实的理解,那么你已经为进入更深层次的Python世界做好了准备。在这个进阶篇中,我们将深入探讨Python的高级特性,并着重于如何在实际工作中应用这些知识。深入理解Python的高级特性掌握在实际项目中常用的技巧和最佳实践提高代码质量和性能了解Python在各个领域的专业应用让我们开始这段激动人心的Python进阶之旅吧!

weixin_44067082的博客 2337

牛客堂刷题(常见面试题精讲)之矩阵打印

题目:   实现转圈打印矩阵       1   2    3  4   10 11 12  5    9   8    7   6 输出是1 2 3 4 5 6 7 8 9 10 11 12 思路:   每次只需要打印一圈即可,然后左上角坐标都加1,右下角都减一,当两个的坐标错过去了就停止 代码: public class CircleMatrix {

夫唯不争,故天下莫能与之争。 916

Akamai移动端Sensor数据采集与BMP风控机制深度解析

本文深度解析了Akamai在移动端风控中的核心机制,重点阐述了Sensor数据如何通过采集陀螺仪、加速度计等硬件信息,结合设备指纹生成连续且符合物理规律的行为轨迹。详细剖析了数据从采集、加密校验到通过BMP风控三重验证(校验位、时间差、数据逻辑)的完整流程,并提供了从模拟优化到自建风控模型的实用应对思路。

quiet的专栏 284

1 四种防反接电路——multisim仿真

摘要:防反接电路可防止电源反接损坏器件,主要有四种方案:1)二极管串联(低成本,适用小电流);2)整流桥(无极性输入,但效率低);3)保险丝+稳压管(低损耗但需更换);4)MOS管方案(大电流、高效率,主流选择)。选型需考虑电流、压降和成本,MOS管因其低导通电阻(毫欧级)成为大电流应用的首选。口诀:"小电流二极管,大电流用MOS"可快速指导设计。

XU157303764的博客 1568

Java Scanner输入练习

学习笔记

stressdout的博客 1891

吃透工业通信:C#工控机实现Modbus、OPC UA、Profinet、EtherCAT协议全适配

本文介绍了基于C#的工业通信协议全适配方案,采用分层架构设计实现Modbus、OPC UA、Profinet和EtherCAT四种主流协议的统一管理。核心包括:1)三层架构(应用层、抽象层、协议层)降低耦合;2)定义统一通信接口IIndustrialCommunication;3)工厂模式创建不同协议实例;4)以Modbus TCP为例展示具体实现。该方案经过实际项目验证,可简化多协议设备管理,提升工业自动化系统的开发效率。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 721

Java刷题常用API(二)———— 通过BufferedReader从屏幕读入数据

一般从屏幕读入数据时,都使用new Scanner(System.in)的方式,如下 Scanner input = new Scanner(System.in); String s = input.nextLine(); // 读入一行 input.close(); 1)使用BufferedReader从屏幕读入数据 还有一种不常用到的方式,可以使用BufferedReader...

ProLayman的博客 730

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java刷题常用API(三)———— 读和写txt文件内容

1)回顾:Scanner和BufferedReader从屏幕读入数据 之前讲了怎么使用Scanner和BufferedReader从屏幕读入数据,如下: Scanner: import java.util.Scanner; // 省略其他代码 Scanner scan = new Scanner(System.in); scan.nextLine(); scan.close(); Bu...

ProLayman的博客 903

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

竞赛刷题用源文件命名及输入输出

【Java基础】竞赛刷题用源文件命名及输入输出 链接

weixin_46356409的博客 135

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java-常用API

void setSize(int width, int height):调整此组件的大小,使其宽度为width,高度为height,单位是像素。void setBounds(int x, int y, int width, int height):设置位置和大小。void setBounds(int x, int y, int width, int height):设置位置和大小。是可以添加组件的组件。void setLocation(int x, int y):设置位置(x坐标,y坐标)

lizhiwei21的博客 1092

Java--常用的API

API概念:应用程序的接口。Java API:指的就是JDK中提供的各种功能的JAVA类。

2302_80045541的博客 806

java 中的Scanner类

什么是Scanner类? Scanner类–一个可以解析基本类型和字符串的简单文本扫描器。 例如;一下代码使用户能够从 System.In 中读取一个数。 Scanner sc = new Scanner(System.In) ; int i = sc.nextInt(); 备注; System.In 系统输入指的是通过键盘录入数据。 什么叫打印输出 ---是程序当中的数据在屏幕当中显示出。 什么叫键盘输入 —是通过双手打字把数据从键盘录入程序中。 引用类型的一般使用步骤 1.导包 你想用的这个人,他在

weixin_50212958的博客 447

常用API(1)

学习一个API的时候,我们重点要看四个地方: 第一个地方:看类所在的包 因为java.lang包下的类,我们是可以直接使用的,不需要导包。 其他包下的类,我们都是要导包后才能使用的 第二个地方:看类的描述 第三个地方:看类的构造方法 第四个地方:看 类的成员方法 1.2 包和导包 那什么是包呢? 包其实就是文件夹 作用:对类进行分类管理 包的定义格式: 格式:package 包名; 注意:包名一般是公司域名反写,并且多级包用.分开 举例:www.itheima.com 范例:packa

XYZ1110i的博客 808

Java学习 第十六章 API / Scanner类 /匿名对象/Random/对象数组/ArrayList

第十六章 一、API概述 API(Application Programming Interface),应用程序编程接口。Java API 是一本程序员的字典,是JDK中提供给我们使用这些类的说明文档。 API下载链接 可用 http://www.6down.net/soft/html/22382.html 第一看包路径。第二看构造方法 第三看方法摘要 二、Scanner类 2.1 Scanner类概述 Scanner类 的功能:可以实现键盘输入数据到程序当中(都是小写才是关键字) 引用类型的一般使用步

qq_40027172的博客 269

学习Java第五天——常用API

常用API

qq_54473788的博客 274

Scanner cannot be resolved to a type最菜鸟新手问题

刚开始接触java,这个问题非常简单但是在网上怎么也找不到答案,我后来翻书找到了。希望可以对各位同学有帮助。 Scanner类。使用前需要将其导入。 也就是说在代码的最前端加入 import java.util.Scanner; 这样就可以了。 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅...

Is_filicker的博客 3万+

java学习笔记3:接收屏幕输入-连续接收

import java.util.Scanner; public class ScannerDemo{ public static void main(String[] args){ //生成一个扫描等待系统输入的类的实例对象 in; Scanner in = new Scanner(System.in); //定义一个字符串类型的变量s接收对象in的nextLine()方法获取用户输入并返回的字符串值 String s = in.n

weixin_39984540的博客 950

java学习第七-——八天---------->常用的API (上)

1.概述导包使用不同包下的类时,使用的时候要写类的全路径,写起来太麻烦了。为了简化带包的操作,Java就提供了导包的功能。导包的格式格式:import 包名;范例:import com.heima.Student;2.包和导包(1)包的本质和作用包的本质就是文件夹,作用就是管理过个类文件快捷键自动导包:alt+enter(2)定义包的格式package 包名.包名;在idea中包声明的代码是是自动生成的;一般为域名的反写,用点隔开,必须在类文件中的第一行。(3)导包格式。

晓嘉碧玉的博客 770

Java常用的输入输出介绍

Java常用的输入输出介绍 先看输出 使用System.out.println()或者System.out.print(),两者差不多,不同在于前者输出后会换行,后者输出后不换行。例 public class Main{ public static void main(String[] args){ System.out.println("hello!"); System.out.print("abc"); System.out.print("123...

cnds123的专栏 1330
上一篇: Java刷题————Java的零星使用(二)
下一篇: Vue学习一些注意点
ProLayman
博客等级 码龄10年 105粉丝 192原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值