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类型的值。这是最简单的一种情况。来看运行结果:
可以看到。成功判断出来了。这是因为,当用户输入int值后,nextInt不会抛出异常。catch语句也就监测不到异常。从而打印另外一种语句。不过这个代码并不完美。因为如果用户输入其他类型的数据代码也照样说这是double类型。不过我们这个程序是在假想环境下运行的。即用户只会输入int或double类型的值。大部分学习的例子都是在这一环境下运行的。如果你去深究,你会发现他们并不完美。不过这里只是举个例子。
如果我们加几行代码。让他捕捉一下代码运行所造成的时间消耗。
以下是在i5 6200u处理器和12GB内存(运行Windows10 x64)下的代码与运行结果:
可以看到。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()) + "毫秒"); } }
来看运行结果
很明显,这个算法所造成的时间开销比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()) + "毫秒"); } }
接下来是这个算法的执行时间
可以看到。执行时间与算法2差不多。但是无论是算法2还是算法3,他们都尽可能减少了两种情况的耗时。直接使用try会使得两种情况下使用时间并不均匀。因为执行catch与不执行catch的资源消耗是不一样的。当然应该还会有其他方法。欢迎指出我的回答中某些不对的地方qwq本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用 1
悬赏问题
- ¥15 模电中二极管,三极管和电容的应用
- ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
- ¥15 气象网格数据与卫星轨道数据如何匹配
- ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
- ¥15 微软账户问题不小心注销了好像
- ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
- ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
- ¥20 关于web前端如何播放二次加密m3u8视频的问题
- ¥15 使用百度地图api 位置函数报错?
- ¥15 metamask如何添加TRON自定义网络