如何解决大量的if语句或switch case语句?
洪流学堂,让你快人几步。
本篇内容来自洪流读书会解读书籍《代码大全2》。
很多面试官喜欢问这样的问题,如何解决大量的if语句或switch case语句?如果你仅仅在优化的层面回答,可能不能让面试官满意。
那怎么回答更好呢?
表驱动法
在这种情况下可以使用表驱动法。
表驱动法是一种编程模式(scheme)一从表里面查找信息而不使用逻辑语句(if和case)。事实上,凡是能通过逻辑语句来选择的事物,都可以通过查表来选择。对简单的情况而言,使用逻辑语句更为容易和直白。但随着逻辑链的越来越复杂,查表法也就愈发显得更具吸引力。
在适当的环境下,采用表驱动法,所生成的代码会比复杂的逻辑代码更简单、更容易修改,而且效率更高。假设你希望把字符划分成字母、标点符号和数字三类,那么你也许会用到下面这种复杂的逻辑链:
另一方面,如果用一个查询表(ookup table),就可以把每一个字符的类型保存在一个用字符编码访问的数组里。那么上述的复杂代码片段就可以替换为:
这段代码假设charTypeTable数组已经提前创建好了。这时你把程序中的信息存放在数据里而不是逻辑里一也就是说,放在表中而不是if检测中。
使用表驱动法必须要解决的两个问题
1、你必须要回答怎样从表中查询条目的问题
你可以用一些数据来直接访问表。比如说,如果你希望把数据按月进行分类,那么创建一个月份表是非常直截了当的。你可以用一个下标从1到12的数组实现它。
另一些数据可能很难直接用于查表。例如,假设你希望按照社会安全号码做数据分类,那么除非你可以承受在表里面存放99-99999条记录,否则就不能用社会安全号码直接查表。你会被迫采用一种更为复杂的方法。下面是从表里面查询记录的方法列表:
- 直接访问(Direct access)。比如保险费率表,游戏中常用的数据表等等。可以直接通过一个值,比如说保险费率表中的年龄,找到对应的数据。
- 索引访问(Indexed access)。有的时候,只用一个简单的数学运算还无法把age这样的数据转换成为表键值。这类情况中的一部分可以通过使用索引访问的方法加以解决。当你使用索引的时候,先用一个基本类型的数据从一张索引表中 查出一个键值,然后再用这一键值查出你感兴趣的主数据。比如游戏中需要根据玩家的职业、等级等来确定获得的奖励,就可以通过索引转换的方式。
- 阶梯访问(Stair-step access)。还有另外一种访问表的方法,那就是阶梯访问。这种访问方法不像索引结构那样直接,但是它要比索引访问方法节省空间。阶梯结构的基本想法是,表中的记录对于不同的数据范围有效,而不是对不同的数据点有效。最常见的就是评分系统,可能需要根据不同的得分范围来获得最终的得分。
2、你应该在表里面存些什么
有的时候,表查询出来的结果是数据。如果你遇到的是这种情况,那么就可以把这些数据保存到表里面。在另外一些情况下,表查询出来的结果是动作(action)。在这种情况下,你可以保存一个描述该动作的代码,或者,在有些语言里,你可以保存对实现该动作的子程序的引用。无论是哪一种情况,表都会变得更为复杂。
扩展阅读
【扩展学习】在洪流学堂公众号回复
读书会
可以阅读本系列所有文章
我是大智(vx:zhz11235),你的技术探路者,下次见!
别走!点赞,收藏哦!
好,你可以走了。
如何解决大量的if语句或switch case语句?相关推荐
- c语言 case语句用法,switch ... case语句的用法[组图]
switch ... case语句的用法[组图] 08-13栏目:技术 TAG:switch case语句 switch case语句 当情况大于或等于4种的时候就用switch ... case语 ...
- c语言 case语句用法,switch case语句的用法
switch语句是多分支选择语句,用于基于不同的条件来执行不同的动作.下面讲解switch case语句的具体用法. Switch作为选择结构中必不可少的语句也被加入到了Swift中,只要有编程经验的 ...
- php case 多个条件判断语句,PHP switch case语句
PHP 中的条件控制语句有两个,一个是 if else 语句,另一个是 switch case 语句.上节讲解了 if else,本节接着讲解 switch case 语句. switch 语句类似具 ...
- switch case语句的用法
switch case语句的用法 我们首先来看一下switch case 语句的一般形式是怎样的 switch(表达式){case 常量1 :代码块:break:case 常量2:代码块:break: ...
- java switch case语句_在Java中使用switch Case语句的例子
当我们有多个选项,并且需要为每个选项执行不同的任务时,就需要使用Switch case语句. Switch case语句的语法如下-switch (variable or an integer exp ...
- 在C++中对字符串std::string使用switch/case语句
如果你使用C语音的string,也就是char *,是可以放在switch/case语句中的. 在C++中是不能对字符串string使用switch/case语句的,这里的string指的是std:: ...
- c语言case怎么输入字母,如何使用switch case语句将字母转换为数字
我正在制作黑色插口游戏,并且需要使用switch case语句将A转换为11,将T,Q,J和K转换为10,但是我不确定如何执行代码.有人会帮助我解决这个问题吗?如何使用switch case语句将字母 ...
- C语言switch case语句详解
当分支比较少的时候我们使用if else语句解决,当分支比较多的时候,我们要使用switch case语句解决,针对分支的复杂性选择合适的程序解决. 当分支过多时,用 if else 处理会不太方便, ...
- C语言case次数有限制吗,用switch...case语句统计数字、空格和其他字符出现的次数...
//用switch...case语句统计数字.空格和其他字符出现的次数 //转自K&R #include int main(void) { int c, i, nwhite, nother, ...
最新文章
- Python matplotlib 绘制量场图
- 刚刚,我国智能科学技术最高奖揭晓!
- Activity应用场景解析
- Magic Leap大举进军AR医疗:新品率先与医疗机构合作,挖走HoloLens老客户
- wsl(windows上运行linux)安装到非C盘解决方案
- 2020 阿里云原生实战峰会即将开幕 云原生落地的正确姿势
- tomcat 设置java内存_Tomcat 设置JVM内存大小
- 数列分块入门 7(LibreOj-6283)
- MyCat分布式数据库集群架构工作笔记0010---高可用_Mycat主--从复制配置下
- 常用的php.ini 配置选项
- 智能优化算法(源码)-飞蛾扑火优化算法(MFO)
- word-break: break-all与word-wrap:break-word的区别
- 计算机毕业论文工作进展情况,论文中期检查进展怎么写_论文中期检查表怎么写_论文进展情况怎么写...
- app消息推送的详细实现教程
- test failed: The forked VM terminated without saying properly goodbye. VM crash or System.exit
- 图像处理: 可见光波长(wavelength)与RGB之间的转换
- AOP切面之实现计算器加减乘除--基于注解的方式
- win10.10 激活
- html写文章发布,写文章.html
- python学习--mysql
热门文章
- java 11_Java 11 正式发布!8年免费使用!
- vector 结构体排序_指下码上横戈行——排序
- android json.out,Android 之 json数据的解析(jsonReader)
- MATLAB点击运行并计时没反应,MATLAB计时器对象陷阱和不良用法
- python urlretrieve_使用urllib库的urlretrieve()方法下载网络文件到本地的方法
- 如何销毁一个实例化对象_基于脚本的游戏对象系统(1) 实例化、组件及生命周期...
- 形式多样!APP引导页设计灵感
- 设计灵感|简约复古风格海报设计这样玩
- 2020年的UI设计师需要会什么软件
- elasticsearch最大节点数_ElasticSearch读写底层原理及性能调优