Java中next()和nextLine()区别及用法「建议收藏」

Java中next()和nextLine()区别及用法「建议收藏」今天在项目之余,到杭电上刷了一道题,那道题是1062题,程序本身不是难,但是在里面实现过程中,突然发现用的Scanner类进行输入的,用到了next和nextLine这两个方法,在输入过程中也遇到一些问题,接下来进行讲述自己遇到的问题,以及如何解决的杭电1062题目:TextReverseProblemDescriptionIgnatiuslike

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

今天在项目之余,到杭电上刷了一道题,那道题是1062题,程序本身不是难,但是在里面实现过程中,突然发现用的Scanner类进行输入的,用到了next和nextLine这两个方法,在输入过程中也遇到一些问题,接下来进行讲述自己遇到的问题,以及如何解决的

 

杭电1062题目:

 

Text Reverse

Problem Description
Ignatius likes to write words in reverse way. Given a single line of text which is written by Ignatius, you should reverse all the words and then output them.
 

 

Input
The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.

Each test case contains a single line with several words. There will be at most 1000 characters in a line.
 

 

Output
For each test case, you should output the text which is processed.
 

 

Sample Input
 
3 olleh !dlrow m’I morf .udh I ekil .mca

 

 

Sample Output
 
hello world! I’m from hdu. I like acm.

Hint

Remember to use getchar() to read ‘\n’ after the interger T, then you may use gets() to read a line and process it.

 
 

大概的意思就是:

给出一个整数n,接下来输入n行字符串,然后每行字符串按照空格取每一个单词,然后将每个单词逆序输出
 
题目很简单,因此在这里直接贴代码,讲一下自己遇到的问题:
 
import java.util.Scanner;

public class Main {

	public static String reverse1(String s) {
		int length = s.length();
		if (length <= 1)
			return s;
		String left = s.substring(0, length / 2);
		String right = s.substring(length / 2, length);
		return reverse1(right) + reverse1(left);
	}

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while (in.hasNextInt()) {
			int num = in.nextInt();  // 这里进行整数输入n  标注为:1
			String str;
			in.nextLine();           // 这里开始没有加,出现了问题  标注为:2
			for (int i = 0; i < num; i++) {
				str = in.nextLine();       // 这里就是用来输入整行字符串  标注为:3
				String[] s = str.split(" ");
				for (int j = 0; j < s.length; j++) {
					if (j != s.length - 1)
					{
						String ss = reverse1(s[j]);
						System.out.print(ss + " ");
					}
					else
					{
						String ss = reverse1(s[j]);
						System.out.print(ss);
						int p = str.length() - 1;
						while (str.charAt(p) == ' ') {
							System.out.print(' ');
							p--;
						}
						System.out.println();
					}
				}
			}
		}
	}
}

在上面代码的注释处,分别标记了1,2,3点:

1、首先输入一个整数n,
2、最开始没有加上这一句,
3、最开始是str = in.next()
 
这里就出现了问题,
因为  next()  这个方法呢,你输入了一串字符串, 他只得到空格、tab键、回车的第一个字符串,比如:
hello world! 这个字符串,只得到 hello ,如果是循环的话,第二次就能得到 world!
这样的话就得不到后面要操作的事情,因此查资料后采用nextLine()这个方法,这就是你输入一行字符串,检测到回车之后就保存,比如:
hello world! 这个字符串,就得到了整个 hello world! 字符串
 
上面读取整行字符串用nextLine()即可解决,但是,又出问题了:
1、上面代码注释中,最开始没有第二个in.nextLine()这一条语句,出现了下面的第二点的问题:
2、问题:没有in.nextLine()的话,程序在debug模式下运行,发现直接先跳过第一次的str = in.nextLine();这条语句,以str = 空形式传递了值,因此,后面相当于做了一次空操作,输出了一个空行,问题在哪呢?看下面第三点:
3、查了资料,就是说,当next()、nextInt()、nextDouble()等等这些之后,你如果不再加一条in.nextLine()的话,下面如果用到了类似str = in.nextLine(); 这条语句的话,会首先读取上面next()、nextInt()、nextDouble()等等这些语句的回车作为一条默认的(为什么是这样的机制呢?还需要继续探索),因此,解决的办法看下面第四点:
4、就是在输入 next()、nextInt()、nextDouble()等等这些 之后,再用一个in.nextLine()这个来截取上面的一个回车操作,后面的nextLine()在第一次才能起作用
 
其实解释的自己不是很满意,因此希望大家一起来整理一下,百度了很多,各种copy,然后基本上千篇一律的答案,因此想总结一下,希望和大家一起总结一篇比较满意的出来~~

 

更多精彩敬请关注公众号

Java中next()和nextLine()区别及用法「建议收藏」

Java极客思维

微信扫一扫,关注公众号

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

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

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


相关推荐

  • Java设计模式(二)之创建型模式:抽象工厂模式

    Java设计模式(二)之创建型模式:抽象工厂模式

    2021年4月8日
    119
  • 局域网内实现不同网段ip通信_局域网不同网段互访

    局域网内实现不同网段ip通信_局域网不同网段互访1.使用场景电脑使用网段ip为172.23.0.0/16,设备ip为192.168.1.0/24。将电脑和设备通过交换机连接起来,满足了电脑和设备处于同一局域网不同网段,不能进行网络通信。为了能够进行通信,比如,进行设备的密码重置等,都需要能够通信才能完成。2.参考方案可以在电脑的网络设置里的高级配置中,添加一个和设备处于同一网段的ip。需要注意的是,添加的ip之前要先使用ping命令判断局域网中是否存在相同ip的设备,为了避免ip冲突。有时你会发现ping不通的ip,添加之后也有不通的情况。这

    2022年9月12日
    1
  • 【面试篇】SpringMVC工作流程「建议收藏」

    【面试篇】SpringMVC工作流程「建议收藏」基础介绍SpringMVC主要是通过前端控制器controller中的注解来完成请求处理的。前段请求从web.xml中servlet的配置开始,根据servlet拦截的url-parttern,来进行请求转发控制。处理请求的流程首先用户发送请求————>前端控制器,前端控制器根据请求信息(如URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在SpringWeb

    2022年6月5日
    44
  • 【Android】实现登录、注册、数据库操作(极简洁)[通俗易懂]

    我最近又写了一篇文,是这篇文章的升级版,借此文引流一下:《【Android】实现登录、注册、数据库操作(极复杂)》本篇源码地址(进去找JustLoginRegister):(2019-12-05更新:我已经把Gradle更新到3.5最新版了,dependencies也已经都迁移到androidx了,特此说明)https://github.com/littlecurl/AppProj…

    2022年4月17日
    227
  • C++多线程通信_c++ socket 多线程

    C++多线程通信_c++ socket 多线程参考:https://m.imooc.com/article/289630C++11标准库新引入的线程库https://www.jianshu.com/p/e5a3498ba930(一)多线程编程#include<iostream>#include<thread>#include<mutex>#include<condi…

    2022年10月6日
    2
  • c++创建对话框_窗体边框改为对话框样式

    c++创建对话框_窗体边框改为对话框样式本例中涉及到对话框标题栏的自绘,双缓冲位图的显示以及位图按钮类的使用。

    2022年10月8日
    1

发表回复

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

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