Day11-Scanner

Day11-Scanner

Scanner介绍

Scanner 对象:

之前我们学的基本语法中我们并没有实现程序和人的交互,但是 Java 给我们提供了这样一个工具类,我们可以获取用户的输入。

java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。

基本语法:

Scanner s = new Scanner(System.in);

通过 Scanner 类的 next()与 nextLine()方法获取输入的字符串:在读取前我们一般需要使用 hasNext()与 hasNextLine()判断是否还有输入的数据。

java.util.Scanner 的解读:

“java.util.Scanner” 是 Java 编程语言中的一个类。

“java.util” 是 Java 标准库中的一个包(package)名称,这个包中包含了很多实用的工具(utility)类和接口。

“Scanner” 是其中的一个类,它主要用于从标准输入(通常是键盘输入)、文件等来源中读取数据。它提供了方便的方法来解析各种基本数据类型和字符串。

next()与 nextLine()方法分别的用法

一、next()方法

  • next()方法会从输入流中读取下一个单词(以空白字符分隔)。

  • 它会在遇到空白字符(如空格、制表符、换行符等)时停止读取,并返回当前读取到的内容。

  • 假设用户输入 “hello world”,next()方法只会读取到 “hello”,因为它在遇到第一个空白字符时就停止了读取。

    流程: 先接收,再判断,最后是关闭

    示例:

    ​ 创建scanner对象,判断是否有输入的字符串,输出 输入的内容

    //创建一个扫描器对象,用于接收键盘数据
            Scanner scanner = new Scanner(System.in);
    
            System.out.println("使用next方法接收:");
    
            //判断用户有没有输出字符串
            if(scanner.hasNext()){
                //使用next方法接收——接收单个单词关闭
                String str=scanner.next();    //程序会等到用户输入
                System.out.println("输入的内容为:"+str);
            }
            //属于IO流的类,用完就关闭,否则一直占用资源!!!!!!!!!!!!
            scanner.close();//关闭
    

    输入Hello world时,只输出一个Hello

    使用next方法接收:
    Hello world
    输入的内容为:Hello
    

    注意事项:

    在 Java 中,变量名的大小写是敏感的。

    在这段代码中,Scanner scanner = new Scanner(System.in);这里定义了一个变量名为scanner,使用小写字母开头。这是遵循 Java 中变量命名的一般规范,通常变量名以小写字母开头,多个单词组成时,后续单词首字母大写(驼峰命名法)。

    而在代码中其他地方如果出现大写的Scanner,那是在引用类名本身。比如在创建对象的语句中new Scanner(System.in),这里的Scanner是指java.util.Scanner这个类,必须使用正确的类名来创建对象。

    总结来说,小写的scanner是一个特定的对象变量名,而大写的Scanner是在引用类的名称以进行对象的创建等操作。

二、nextLine()方法

  • nextLine()方法会读取输入流中的一整行内容,包括空白字符。
  • 它会读取到当前行的末尾(换行符处),并返回包括换行符之前的所有字符。
 Scanner scanner = new Scanner(System.in);
        System.out.println("使用nextline方法接收:");

        if(scanner.hasNextLine()){
            String str = scanner.nextLine();
            System.out.println("输出的结果为:"+str);
        }
     scanner.close();

hasNext()

在 Java 中,Scanner类的hasNext()方法用于判断输入流中是否还有下一个输入项(token)。

具体解释如下:

一、返回值及用途

  1. 返回值类型:这个方法返回一个布尔值。如果输入流中还有下一个输入项可读取,它就返回true;如果没有更多的输入项可读取,它就返回false
  2. 常见用途:通常在一个循环中使用这个方法来不断检查是否有更多的输入,以便决定是否继续读取输入。

二、输入项的概念

  1. 定义:输入项是指通过输入流提供的、以分隔符(如空格、换行符等)分隔的一块数据。具体的分隔规则取决于Scanner的构造方式和默认的分隔模式。
  2. 示例:如果用户在控制台输入 “hello world”,这里面的 “hello” 和 “world” 可以分别被看作两个输入项。如果输入的是一个整数,那么这个整数就是一个输入项。

三、与其他方法配合使用

  1. next()方法配合:通常在使用next()方法读取输入项之前,先使用hasNext()方法进行判断,以确保不会在没有输入项可读取时调用next()方法而导致异常。

遇见某一个类,选中,按住Ctrl键,单击鼠标,就进入了类的源代码

实际应用:判断输入的是不是整数/小数

Scanner scanner = new Scanner(System.in);

        //从键盘接收数据
        int i1=0;
        float i2=0.0f;
        System.out.println("请输入整数:");
        if(scanner.hasNextInt()){
           i1 = scanner.nextInt();
            System.out.println("输入的整数是:"+i1);
        }else {System.out.println("你输入的不是整数");}
        
        
        
        
        
        
        
        //!!!!!!!!!!!!!!!!!!!!!!
        //下面的这段代码有问题,当输入1的时候,输出结果为      输入的小数是:1.0
        System.out.println("请输入小数:");
        if(scanner.hasNextFloat()){
            i2 = scanner.nextFloat();
            System.out.println("输入的小数是:"+i2);
        }else {System.out.println("你输入的不是小数");}
        scanner.close();
        
        /*
        当输入一个整数时,hasNextDouble()方法也会返回true,因为整数可以被自动转换为小数。因为整数转换为浮点数自动转换
        */

易出错的地方:

错误1-----------------------------
//判断输入的是不是小数
Scanner scanner = new Scanner(System.in);
        System.out.println("请输入小数:");
        if(scanner.hasNextDouble()){
            double a= scanner.nextDouble();
            System.out.println("输入的小数是:"+a);
        }else {
            System.out.println("这个书不是小数");
        }
        Scanner close;
 //输入的是12345,是一个整数,应该输出的是"这个书不是小数",但是输出的是12345.0。
 //出错了!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 //当你在Java中使用Scanner类的nextDouble()方法来读取输入时,即使用户输入的是一个整数值(如 12345),这个方法也会将它当作双精度浮点数(double)来读取和处理。这意味着,无论输入的是整数还是真正的小数,只要它是有效的数值,都会被当作带有小数点的格式存储在 double 变量中。因此,整数 12345 会被读入并显示为 12345.0。
 
 
 
 
 
 
错误2--------------------------------------------------下面的代码对5.0这样的数无效
 //解决思路:如果你想要区分用户输入的是整数还是小数,就需要在读取之后做一些额外的检查,比如比较该值是否与其强制转换为 int 类型的值相等。如果两者相等,则说明输入的是一个整数;否则,就是一个小数。-------
 import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("请输入一个数:");
        
        if (scanner.hasNextDouble()) {
            double input = scanner.nextDouble();
            
            // 如果input和它的整数部分相等,那么它就是一个整数
            if (input == (long) input) {
                System.out.println("这个数不是小数");
            } else {
                System.out.println("输入的小数是:" + input);
            }
        } else {
            System.out.println("输入的不是一个有效的数字!");
        }
        
        scanner.close();
    }
}

实际应用:将输入的数据求和、求平均值

//我们可以输入多个数字,并求其总和与平均数。每输入一个数字用回车确认。通过输入-999数字来结束输入并输出执行结果。
//下面的代码有问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入:");
        //和
        double sum=0;
        //有多少个数
        int num=0;

        //通过循环判断是否有数字,并进行求和和数量统计
        while(scanner.hasNextDouble()){
             sum+=scanner.nextDouble();
            num=num+1;//num++
            System.out.println("你输入了第"+num+"个数,当前的和是"+sum);


        }
        System.out.println(num+"个数的和是"+sum);
        System.out.println(num+"个数的平均数:"+(sum/num));
        scanner.close();
        
        
        //不过确实存在一个问题,就是当用户输入结束后,没有合适的方式来跳出循环。
        
目前代码中使用 while (scanner.hasNextDouble()) 作为循环条件,它会一直等待并判断是否还有下一个可解析为双精度浮点数的输入。但在实际使用场景中,用户需要有一个明确的方式来告知程序输入结束了,不然程序就会一直处于等待输入的状态,无法输出最终的求和以及平均值结果。


正确的代码:
//实际应用:将输入的数据求和、求平均值
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入:");
        double sum=0;
        int num=0;
        double i=0;
         while(scanner.hasNextDouble()){
                i=scanner.nextDouble();
                if(i==-999){
                 break;
                }
                num+=1;
                sum+=i;
         }
         if(num>0){
             System.out.println("输入的数字总数是:"+num);
             System.out.println("输入的数字平均数是:"+(sum/num));
         }else {
             System.out.println("没有输入任何有效的数字(或只输入了-999)");
         }

        scanner.close();

拓展:

在 Java 集合框架中,Iterator接口用于实现迭代器功能,它定义了一系列方法如hasNext()用于判断是否还有下一个元素,next()用于获取下一个元素等

迭代器(Iterator)是一种设计模式,用于遍历一个容器(如集合类)中的元素。它提供了一种统一的方式来访问容器中的各个元素,而不需要了解容器的内部结构。

posted @ 2024-10-07 18:12  1hahahahahahahaha  阅读(35)  评论(0)    收藏  举报