_小柒 2022-01-21 18:29 采纳率: 100%
浏览 116
已结题

java怎么判断scanner输入的数据类型

java怎么判断scanner输入的数据类型,
是int还是double

  • 写回答

5条回答 默认 最新

  • CTimet 2022-01-21 21:06
    关注

    这种功能有多种实现方法。最简单的就是使用try-catch结构,通过捕捉各类异常,从而判断用户输入的类型。这里给出一个代码实现

    package help.Scanner;
    
    import java.util.InputMismatchException;
    import java.util.Scanner;
    
    public class Test
    {
        public static void main(String[] args)
        {
            Scanner in = new Scanner(System.in);
            System.out.println("请输入测试内容");
            try { 
                in.nextInt();
                System.out.println("Int类型");
            } catch (InputMismatchException e) {
                System.out.println("Double类型");
            }
        }
    }
    

    在这里。我们假设用户只会输入int或double类型的值。当然实际应用的时候绝大数用户是不会那么做的。这里给出的代码迎合了一种假想的理想环境。即用户永远只会输入int或double类型的值。这是最简单的一种情况。来看运行结果:

    img


    可以看到。成功判断出来了。这是因为,当用户输入int值后,nextInt不会抛出异常。catch语句也就监测不到异常。从而打印另外一种语句。不过这个代码并不完美。因为如果用户输入其他类型的数据代码也照样说这是double类型。不过我们这个程序是在假想环境下运行的。即用户只会输入int或double类型的值。大部分学习的例子都是在这一环境下运行的。如果你去深究,你会发现他们并不完美。不过这里只是举个例子。
    如果我们加几行代码。让他捕捉一下代码运行所造成的时间消耗。

    img


    以下是在i5 6200u处理器和12GB内存(运行Windows10 x64)下的代码与运行结果:

    img


    img


    可以看到。try确实实现这个功能比较容易,如果用户输入的是Int类型,那好说,不会触发catch子句,所带来的开销就几乎是0。但是如果用户输入了double类型的数据,那么就会触发catch句,虽然98毫秒这个数值可能并不准确而且currentTimeMillis方法甚至可能会受到系统影响(我们后面的代码使用了更精确的Date类)。由于这个数据同时受到用户输入的影响。在我费劲力气尝试出了一个最小值作为这篇回答的结果,但是毫无疑问,一旦触发catch结构,那么带来的开销就不可能为0。既然话都说到这了。我们不妨研究一下如何用最少的开销完成这个并不怎么重要的功能。毕竟如果你的项目中真的需要这个功能。你肯定想用最少的开销来解决问题。所以这里我们就来研究研究这个问题
    很明显,如果利用方法本身所抛出的异常来判断。那么这种做法肯定是不划算的。那么我们不如用一个用户不太可能抛出异常的方法来接收用户的数据。然后进行对比。对比所产生的开销可比try语句开销少多了。这里给出一个代码实现

    package help.Scanner;
    
    import java.util.Date;
    import java.util.Scanner;
    
    public class Test
    {
        public static void main(String[] args) throws InterruptedException {
            Scanner in = new Scanner(System.in);
            System.out.println("请输入测试内容");
    
            String userIn = in.nextLine();
            Date start = new Date();
    
            for (int i = 0;i < userIn.length();i++)
            {
                if (userIn.charAt(i) == '.')
                {
                    System.out.println("Double类型");
                    break;
                }
            }
            System.out.println("Int类型");
    
            Date end = new Date();
            System.out.println("花费时间" + (end.getTime() - start.getTime()) + "毫秒");
        }
    }
    

    来看运行结果

    img


    很明显,这个算法所造成的时间开销比catch执行时造成的时间开销少了许多。那么可不可以有其他的优化方案呢?答案是可以的,在这里,我们再给出一种算法。第一种算法是靠看方法是否抛出异常,第二中方法是看用户输入的内容里是否有小数点。接下来,我们利用小数的强制类型转换产生的差异再写一种算法

    package help.Scanner;
    
    import java.util.Date;
    import java.util.Scanner;
    
    public class Test
    {
        public static void main(String[] args) throws InterruptedException {
            Scanner in = new Scanner(System.in);
            System.out.println("请输入测试内容");
    
            String userIn = in.nextLine();
            Date start = new Date();
            double userNI = Double.parseDouble(userIn);
            if (String.valueOf((int)userNI).equals(userIn)) System.out.println("Int类型");
            else System.out.println("Double类型");
    
            Date end = new Date();
            System.out.println("花费时间" + (end.getTime() - start.getTime()) + "毫秒");
        }
    }
    

    接下来是这个算法的执行时间

    img


    可以看到。执行时间与算法2差不多。但是无论是算法2还是算法3,他们都尽可能减少了两种情况的耗时。直接使用try会使得两种情况下使用时间并不均匀。因为执行catch与不执行catch的资源消耗是不一样的。当然应该还会有其他方法。欢迎指出我的回答中某些不对的地方qwq

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 1月29日
  • 已采纳回答 1月21日
  • 创建了问题 1月21日

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog