zoukankan      html  css  js  c++  java
  • Java:Scanner.nextLine()和Scnner.next()的区别,以及多条nextLine()输入问题的解决方法

    目录

    背景

    错误现象

    原因解释

    解释方法

    方法缺点

    晋级解决方法

    背景:

      今天练习算法时候,需要读取多条带有空格的字符串,于是我使用nextLine()【为什么不使用next()的方法,我在后面会说明】,但是当我设置了输入2个包含空白字符串的内容时候,发现只能输入一行数据,然后就停止了。

    错误现象:

    当输入数据调用的是nextLine()方法时结果:

    可以看到第一个数组在没有输入的数据的情况下就被跳过了。

    然后我换了一下方法:

    当输入数据调用的是next()方法时结果:

    可以看到虽然2个数组都有值,但是有2个问题,第一我数据还没输入第二行,第二我数据第一行也没有显示完整

     原因解释:next()和nextLine()的方法说明

    nextLine():nextLine()的是只有读取到Enter键,即nextLine()方法返回的是Enter键之前的所有字符。所以当我输入读取的个数为2的时候,按下了enter键,nextLine()读取到了就结束了第一条信息的输入。

      next():是当读取到空格、tap键、回车键就停止读取信息,所以才会造成第二张图我第一条信息为什么没有读取完整,以及我数据为什么没有读取第二条信息。

     解决方法:

    理解了这个原理,于是很简单的就想出了解决方法【呵呵呵呵呵呵!!!你猜我信不信很简单】,我到现在都没理解我输入数组的个数使用的是nextInt()方法,为什么回车会保存到我后面要输入的数组数据里面。

    解决方法是在输入数据前,输入一个无用数据,抵消掉enter【无法理解】

    实例

    public class text {
        private static int num=0;
        private static String [] numResoult=null;
        public static void main(String[] args) {
            Scanner scanner=new Scanner(System.in);
            System.out.print("设置输入数据的个数:");
            num=scanner.nextInt();
    
            if (num>0 && num<10){
                numResoult=new String[num];
                for (int i=0;i<num;i++){
                    System.out.println("输入第"+i+"行数据");
                    //next()用于抵消掉nextLine()的影响
                    numResoult[i] = scanner.next();
                    numResoult[i]=scanner.nextLine();
                }
                for (int i=0;i<num;i++){
                    System.out.println("numResoult["+i+"]===="+numResoult[i]);
                }
            }
        }
    }

    结果截图:

     方法缺点【这是后来发现的方法补上去的】:

    看上面的最后的图片结果可知,第一行数据的324丢失,第二行数据的42丢失;这是由于数据的第一行被next方法获取走了

    这个解决方法,我们可以把next获取的数据重新和nextLine方法获取的数据一起拼凑在一起,好有道理啊,我先把数据输进去,然后由于失误丢失了一个数据,然后把数据找回来,拼凑在一起,接着在重新计算;这种多此一举的行为,我实在无言再说了。直接换输入方法,用BufferedReader.readLine()可以完美解决这个问题

    进阶解决方法:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class text {
        private static String numRead=null;
        private static int num=0;
        private static String [] numResoult=null;
        public static void main(String[] args) {
            BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
            System.out.print("设置输入数据的个数:");
            try {
                numRead=bufferedReader.readLine();
                System.out.println(numRead);
            } catch (IOException e) {
                e.printStackTrace();
            }
            num=Integer.parseInt(numRead);
            if (num>0 && num<10){
                numResoult=new String[num];
                //输入
                for (int i=0;i<num;i++){
                    System.out.println("输入第"+i+"行数据");
                    try {
                        numResoult[i]=bufferedReader.readLine();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                //输出
                for (int i=0;i<num;i++){
                    System.out.println("numResoult["+i+"]===="+numResoult[i]);
                }
            }
        }
    }

     效果截图

  • 相关阅读:
    枚举扩展,感觉用处很大
    基础缓存操作类
    ASP.NET 4.0 全局取消表单危险字符验证
    拦截所有经过IOC的方法
    关于使用EPPlus插入列,名称管理器公式失效问题案列分析
    IocFactory容器实体
    线程扩展
    IEnumerable扩展支持Add,Remove等操作
    自定义特性。配合枚举使用棒棒哒
    在数据仓储的情况下进一步封装数据库基础操作,此版本为异步版本
  • 原文地址:https://www.cnblogs.com/hahayixiao/p/14012229.html
Copyright © 2011-2022 走看看