多层If语句 和 表格驱动 的对比
网文提到表格驱动,总喜欢拿一层if做例子,然而这样未免也太简单.
下文是三层缩进的if和表驱动比较,大家可自行判断优劣.
业务是这样的,某景点分旺季票价和淡季票价,淡季票为旺季的一半,15岁以下孩子再减半,60岁以上老人再三三折,成人中有军官证的再打二五折,有士兵证的打两折.(假定非实际业务,勿对号入座)
代码:
package tabledriven; /** * 门票计价器 * 传统方式和表格驱动比较 * */ public class TicketCalculater { // Price private double price=144; // discout array private int[][][] arr= { { {2*4,2*5,2*1}, {2*2,2*2,2*2}, {2*3,2*3,2*3}, }, { {1*4,1*5,1*1}, {1*2,1*2,1*2}, {1*3,1*3,1*3}, }, }; // Traditional public double getPriceTraditional(int month,Person person) { double discount=1; if(6<month && month<11) { discount*=1; if(person.getAge()<15) { discount*=0.5; }else if(person.getAge()>60) { discount*=0.33333333333333; }else { if(person.isOfficer()) { discount*=0.25; }else if(person.isSoldier()) { discount*=0.20; } } }else { discount*=0.5; if(person.getAge()<15) { discount*=0.5; }else if(person.getAge()>60) { discount*=0.333333333333333; }else { if(person.isOfficer()) { discount*=0.25; }else if(person.isSoldier()) { discount*=0.20; } } } return price*discount; } // Table driven public double getPriceTableDriven(int month,Person person) { double discount=1; int index1,index2,index3; if(6<month && month<11) { index1=1; }else { index1=0; } if(person.getAge()<15) { index2=1; }else if(person.getAge()>60) { index2=2; }else { index2=0; } if(person.isOfficer()) { index3=0; }else if(person.isSoldier()) { index3=1; }else { index3=2; } discount=arr[index1][index2][index3]; return price/discount; } // Entry point public static void main(String[] args) { TicketCalculater tc=new TicketCalculater(); Person p1=new Person(30,false,false); System.out.println("Ticket price="+round2DecimalPlaces(tc.getPriceTraditional(2, p1))); System.out.println("Ticket price(Table)="+round2DecimalPlaces(tc.getPriceTableDriven(2, p1))); Person p2=new Person(14,false,false); System.out.println("Ticket price="+round2DecimalPlaces(tc.getPriceTraditional(5, p2))); System.out.println("Ticket price(Table)="+round2DecimalPlaces(tc.getPriceTableDriven(5, p2))); Person p3=new Person(44,true,false); System.out.println("Ticket price="+round2DecimalPlaces(tc.getPriceTraditional(8, p3))); System.out.println("Ticket price(Table)="+round2DecimalPlaces(tc.getPriceTableDriven(8, p3))); Person p4=new Person(68,false,true); System.out.println("Ticket price="+round2DecimalPlaces(tc.getPriceTraditional(11, p4))); System.out.println("Ticket price(Table)="+round2DecimalPlaces(tc.getPriceTableDriven(11, p4))); } // round two decimal places of a double public static String round2DecimalPlaces(double d){ java.text.DecimalFormat df =new java.text.DecimalFormat("#0.00"); return df.format(d); } }
Person类:
package tabledriven; public class Person { private int age; private boolean isOfficer; private boolean isSoldier; public Person(int age,boolean isOfficer,boolean isSoldier) { this.age=age; this.isOfficer=isOfficer; this.isSoldier=isSoldier; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public boolean isOfficer() { return isOfficer; } public void setOfficer(boolean isOfficer) { this.isOfficer = isOfficer; } public boolean isSoldier() { return isSoldier; } public void setSoldier(boolean isSoldier) { this.isSoldier = isSoldier; } }
运行结果:
Ticket price=72.00 Ticket price(Table)=72.00 Ticket price=36.00 Ticket price(Table)=36.00 Ticket price=36.00 Ticket price(Table)=36.00 Ticket price=24.00 Ticket price(Table)=24.00
--END-- 2019-12-11 14:01
多层If语句 和 表格驱动 的对比的更多相关文章
- Linux与Windows的设备驱动模型对比
Linux与Windows的设备驱动模型对比 名词缩写: API 应用程序接口(Application Program Interface ) ABI 应用系统二进制接口(Application Bi ...
- JS010. 三元运算符扩展运用(多层判断语句 / 多条表达式)
MDN - 三元运算符 语法 Condition ? exprIfTrue : exprIfFalse 用例: function getFee(isMember) { return(isMember ...
- 任务驱动,对比式学习.NET开发系列之开篇------开源2个小框架(一个Winform框架,一个Web框架)
一 源码位置 1. Winform框架 2. web框架 二 高效学习编程的办法 1 任务驱动方式学习软件开发 大部分人学习软件开发技术是通过看书,看视频,听老师上课的方式.这些方式有一个共同点即按知 ...
- 4 - SQL Server 2008 之 使用SQL语句删除表格
使用删除表格的SQL命令与删除数据的命令一样,只是删除的是表格这个对象, 语法如下:DROP TABLE 表名 一般在删除表格之前,需判断这个表格存不存在,存在则删除,不存在则不进行执行任何代码. 代 ...
- golang的表格驱动测试
一.leetcode的算法题 package main import ( "fmt" "strings" ) func lengthOfNonRepeating ...
- [转帖]Docker五种存储驱动原理及应用场景和性能测试对比
Docker五种存储驱动原理及应用场景和性能测试对比 来源:http://dockone.io/article/1513 作者: 陈爱珍 布道师@七牛云 Docker最开始采用AUFS作为文件系统 ...
- python init 方法 与 sql语句当前时间对比
def init(self,cr): tools.sql.drop_view_if_exists(cr, 'custrom_product_infomation_report') cr.execute ...
- Docker存储驱动之OverlayFS简介
简介 OverlayFS是一种和AUFS很类似的文件系统,与AUFS相比,OverlayFS有以下特性: 1) 更简单地设计: 2) 从3.18开始,就进入了Linux内核主线: 3) 可能更快一些. ...
- python中if语句和循环语句
//2019.12.05 python循环控制结构(一)控制循环结构 1-1 程序的判断语句与组合1.对于python的控制结构主要有以下三大类:(1)分支结构(2)循环结构(3)异常处理 2.pyt ...
随机推荐
- ubuntu下关于profile和bashrc中环境变量的理解(转)
ubuntu下关于profile和bashrc中环境变量的理解(转) (0) 写在前面 有些名词可能需要解释一下.(也可以先不看这一节,在后面看到有疑惑再上来看相关解释) $PS1和交互式运行(r ...
- [lambda] newbies of haskell
site: https://www.haskell.org/ tutorial: http://learnyouahaskell.com/chapters 只言片语 Recursion is impo ...
- 迷你商城后台管理系统————stage2核心代码实现
应用程序主函数接口 @SpringBootApplication(scanBasePackages = {"org.linlinjava.litemall.db", "o ...
- Java获取各种路径
(1).request.getRealPath("/");//不推荐使用获取工程的根路径(2).request.getRealPath(request.getRequestURI( ...
- CentOS7 yum方式 安装mysql 5.7.28步骤
CentOS7系统yum方式安装MySQL5.7 最新的yum源可以去http://dev.mysql.com/downloads/repo/yum下载 1.获取mysql官方yum reposito ...
- Django之路——4 Django的视图层
一个视图函数简称称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何 ...
- UVALive 5099 Nubulsa Expo(全局最小割)
题面 vjudge传送门 题解 论文题 见2016绍兴一中王文涛国家队候选队员论文<浅谈无向图最小割问题的一些算法及应用>4节 全局最小割 板题 CODE 暴力O(n3)O(n^3)O(n ...
- DVWA-文件包含漏洞
本周学习内容: 1.学习web安全深度剖析: 2.学习安全视频: 3.学习乌云漏洞: 4.学习W3School中PHP: 实验内容: 进行DVWA文件包含实验 实验步骤: Low 1.打开DVWA,进 ...
- noi.ac #44 链表+树状数组+思维
\(des\) 给出长度为 \(n\) 的序列,全局变量 \(t\),\(m\) 次询问,询问区间 \([l, r]\) 内出现次数为 \(t\) 的数的个数 \(sol\) 弱化问题:求区间 \([ ...
- github提示Permission denied (publickey),如何才能解决?
参考: https://my.oschina.net/u/1377923/blog/1822038 https://www.cnblogs.com/chjbbs/p/6637519.html