【日撸 Java 三百行】Day 5(Switch语句)
目录
Day 5:Switch 语句的基本使用方法
一、基础知识及案例分析
二、代码及测试
拓展:流程控制语句专题补充
小结
Day 5:Switch 语句的基本使用方法
Task:
- Switch, case, break, default 的用法.
- 单元测试单独使用一个方法, main 方法里面的代码越少越好.
一、基础知识及案例分析
1. 关于 Switch 语句
switch 语句是多分支语句的开关,本质上可以认为是多个 if-else 叠合在一起的共同判断端。相比于if-else if-else更复杂的重叠与非重叠条件,switch可以实现单个信息的多段区分判断,换言之,若我们需要判断的数据是单一变量的值域在多个分段的区分问题(而且这种分段比较多),那么switch要比if-else if-else来得更加直观。
2. 案例分析
关于 switch 语句的一个经典案例就是评级系统,这个案例可直观体现switch的特性。因为分数评级符合单一变量原则、多段原则(评级ABCD…)、分段多原则(就具百分制来看)、而且方便在每个段进行量化(离散化)。
下图可以很好的说明这个系统的特性。
3. 逻辑判断
从上图可以发现,评级系统本质上是分数与等级的映射关系。结合 switch 的判断原理我们知道,这个映射关系实际上是建立在对分数十位和百位的数值判断。故可以在 switch 语句中进行如下判断:
public static char scoreToLevel(int paraScore) {// E stands for error, and F stand for fail.char resultLevel = 'E';// Divide by 10, the result ranges from 0 to 10int tempDigitalLevel = paraScore / 10;// The use of break is important.switch (tempDigitalLevel) {case 10:case 9:resultLevel = 'A';break;case 8:resultLevel = 'B';break;case 7:resultLevel = 'C';break;case 6:resultLevel = 'D';break;case 5:case 4:case 3:case 2:case 1:case 0:resultLevel = 'F';break;default:resultLevel = 'E';}// Of switchreturn resultLevel;}// Of scoreToLevel
这里有个额外注意的点是,:
switch语句的每一个 case 判断,在一般情况下都有break语句,以指明这个分支执行完成后,就跳出该 switch语句。在某些特定的场合下可能不需要 break语句,如在若干判断值共享同一个分支时,就可以实现由不同的判断语句流入相同的分支。
二、代码及测试
代码如下:
package basic;/*** The usage of sth.** @author: Changyang Hu joe03@foxmail.com* @date created: 2025-05-08*/public class SwitchStatement {/************************ The entrance of the program.* * @param args Not used now.**********************/public static void main(String args[]) {scoreToLevelTest();}// Of main/************************ Score to level.* * @param paraScore From 0 to 100.* @return The level from A to F.**********************/public static char scoreToLevel(int paraScore) {// E stands for error, and F stand for fail.char resultLevel = 'E';// Divide by 10, the result ranges from 0 to 10int tempDigitalLevel = paraScore / 10;// The use of break is important.switch (tempDigitalLevel) {case 10:case 9:resultLevel = 'A';break;case 8:resultLevel = 'B';break;case 7:resultLevel = 'C';break;case 6:resultLevel = 'D';break;case 5:case 4:case 3:case 2:case 1:case 0:resultLevel = 'F';break;default:resultLevel = 'E';}// Of switchreturn resultLevel;}// Of scoreToLevelpublic static void scoreToLevelTest() {int tempScore = 100;System.out.println("Score " + tempScore + " to level is: " + scoreToLevel(tempScore));tempScore = 91;System.out.println("Score " + tempScore + " to level is: " + scoreToLevel(tempScore));tempScore = 82;System.out.println("Score " + tempScore + " to level is: " + scoreToLevel(tempScore));tempScore = 75;System.out.println("Score " + tempScore + " to level is: " + scoreToLevel(tempScore));tempScore = 66;System.out.println("Score " + tempScore + " to level is: " + scoreToLevel(tempScore));tempScore = 52;System.out.println("Score " + tempScore + " to level is: " + scoreToLevel(tempScore));tempScore = 8;System.out.println("Score " + tempScore + " to level is: " + scoreToLevel(tempScore));tempScore = 120;System.out.println("Score " + tempScore + " to level is: " + scoreToLevel(tempScore));}// Of scoreToLeveTest
}// Of class
基于测试的要求,数据应该尽可能覆盖每一个 case,运行结果如下:
拓展:流程控制语句专题补充
待补充
小结
在当今的计算机中,switch 语句和 if 语句的速度/效率差距已经可以忽略不计,更多的时候我们考量的是 “谁能够更加清晰的表达逻辑关系”,以增强程序的可读性以及逻辑性。
而这就需要对于问题作出合理分析并且做出正确的模拟,这种能力需要再日常的编程过程中锻炼,以积累足够的经验来辅助自己判断。