继往开来 吐故纳新
日历
网志分类
· 所有网志 (990)
· 个人作品 (62)
· 软件设计 (33)
· 面向对象编程 (22)
· JavaAPI (39)
· Java开源工具 (31)
· Swing (34)
· Java语法细节 (39)
· 样式表CSS (12)
· XML (10)
· J2EE(JavaEE) (23)
· 算法数据结构 (64)
· 正则表达式 (4)
· 软件知识 (6)
· Java线程 (9)
· Web开发.Jsp/Servlet/Struts (20)
· 程序随想录 (7)
· Spring (5)
· Hibernate (7)
· J2SE 高级 (2)
· J2SE 高级 (0)
· Web开发.Ajax (16)
· Web开发.JavaScript (43)
· DB4O (2)
· Web开发.CSS/Html (22)
· C# (20)
· ERP (4)
· JDBC (1)
· 编程资源 (16)
· 编程感悟 (29)
· DB/Sql (13)
· VB (29)
· VC (2)
· 桌面脚本 (3)
· 新兴软件 (3)
· 英语学习 (21)
· 网文转载 (159)
· 职场风云 (39)
· 诗词歌赋 (32)
· 生活感言 (77)
· 奇文共赏 (13)
· 财经纵横 (6)
· 未分类 (11)
站内搜索
友情链接
· 歪酷博客
· 我的歪酷 非非共享界
· 偶要雷锋
· 豆瓣
· nczonline
· 当当网
· easyjf中文站
· Donews
· 天极Java文章列表
· W3CSchool
· taiten的BLOG
· Dojo中国
· Dojo
· Extjs.com
· Lifehack中文网志
· JaveEye的一个AS专题
· Banq's JDon
· Java 中文网址大全
· 梦想Java
· 360Doc个人图书馆
· java开源大全
· 我在硅谷动力的软件下载站
· 站长中国
· 随意贴
· CSS教学素材站
· java 参考中文站
· 面向构件与SOA社区
· 彩字生成
· 派派小说论坛
· 如坐春风
· 英语学习网
· BBC CHina
· www.dlbang.com
· 古文竖排格式在线转化工具
· 免费家谱
· 图片上传基地
· 风景壁纸
· 和风细雨
· MyC#BlogInCsdn

订阅 RSS

0207326

歪酷博客

开此博一为经验积累,二为资料收集,三为同道交流,四为资源共享.
« 上一篇: [Java][翻译+整理]《The Java Developers Almanac 1.4》Java的border(边框)摘录 下一篇: 【原创】试论一个对日项目组的人员配置和职责 »
Junglesong @ 2006-01-19 16:46

http://blog.csdn.net/chensheng913/archive/2006/01/17/581616.aspx?Pending=true  有一个讨论帖,有位网友提出了把以下语句的分支语句取消的问题,他的语句如下:

Dim count1
count1 = salary.Value + USA.Value * Drate + JAN.Value * Jrate - 4000
If count1 < 500 Then
tax.Value = count1 * 0.05
ElseIf count1 < 2000 Then
tax.Value = count1 * 0.1 - 25
ElseIf count1 < 5000 Then
tax.Value = count1 * 0.15 - 125
ElseIf count1 < 20000 Then
tax.Value = count1 * 0.2 - 375
ElseIf count1 < 40000 Then
tax.Value = count1 * 0.25 - 1375
ElseIf count1 < 60000 Then
tax.Value = count1 * 0.3 - 3375
Else
tax.Value = count1 * 0.3 - 3375
End If 

这段代码复杂而多变,给书写,阅读,测试和维护都会带来困难,所以这位网友想消除它是很合理的。


这是个税率计算的语句段,公式是确定的:税=月薪*税率-折扣,税率又和月薪有关系,月薪越高税率越高,首先这里可以归纳出一个基本类
public class TaxItem{
        float limit; // 月薪界限
        float ratio;// 税率
        float discount;// 折扣
       
        public TaxItem(float limit,float ratio,float discount){
                this.limit=limit;
                this.ratio=ratio;
                this.discount=discount;
        }
       
        public TaxItem(){
                this(0.0f,0.0f,0.0f);
        }

        public float getDiscount() {
                return discount;
        }

        public float getLimit() {
                return limit;
        }

        public float getRatio() {
                return ratio;
        }
}

然后就是税计算类:
import java.util.ArrayList;

public class TaxCaculator{
        private static ArrayList list=new ArrayList();
       
        public TaxCaculator(){
                // 这里把各个等级加入到链表中,注意添加顺序是由小到大
                list.add(new TaxItem(500.0f,0.05f,0.0f));
                list.add(new TaxItem(2000.0f,0.1f,25.0f));
                list.add(new TaxItem(5000.0f,0.15f,125.0f));
                list.add(new TaxItem(20000.0f,0.2f,375.0f));
                list.add(new TaxItem(40000.0f,0.25f,1375.0f));
                list.add(new TaxItem(60000.0f,0.3f,3375.0f));
        }
        
        // 这个函数用来计算所得税
        public float getTax(float salary){
                TaxItem item=new TaxItem();
               
                for(int i=0;i<list.size();i++){
                        item=(TaxItem)list.get(i);
                       
                        if(salary>item.getLimit()){
                                continue;
                        }
                        else{
                                break;
                        }
                }               
                
                // 返回最终结果,当然,这个公式也可以放在TaxItem 类中,这里就见仁见智了。
                return salary*item.getRatio()-item.getDiscount();
        }
}

// 调用方法如下
public class Inlet{
        public static void main(String[] arg){
                TaxCaculator taxCaculator=new TaxCaculator();
               
                float salary=1000.f;   
                System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
               
                salary=2000.f; 
                System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
               
                salary=3000.f; 
                System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
               
                salary=4000.f; 
                System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
               
                salary=5000.f; 
                System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
               
                salary=15000.f;
                System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
               
                salary=25000.f;
                System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
               
                salary=55000.f;
                System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
               
                salary=65000.f;
                System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
               
                salary=85000.f;
                System.out.println("Salary="+salary +" Tax="+taxCaculator.getTax(salary));
        }
}

输出如下:
Salary=1000.0 Tax=75.0
Salary=2000.0 Tax=175.0
Salary=3000.0 Tax=325.00003
Salary=4000.0 Tax=475.0
Salary=5000.0 Tax=625.0
Salary=15000.0 Tax=2625.0
Salary=25000.0 Tax=4875.0
Salary=55000.0 Tax=13125.0
Salary=65000.0 Tax=16125.0 

这样就消除了冗长复杂的分支语句。

相应程序扩展:
如果是从配置文件读取各个等级,则需要将TaxCaculator的构造函数中的等级添加部分提出到一个函数中,需要时调用就可以。


欢迎各位朋友和我讨论。
E-mail:junglesong@gmail.com.


最新评论


流行骑士

2006-01-19 18:00

谢谢你,贴子我看过了。
很有收获。
我是做嵌入式的,但对java也很感兴趣。
以后向清多多指教!


2006-01-20 09:26 网址: http://junglesong.ycool.com/

to 流行骑士:
奇文共欣赏,疑义相与析.共同进步吧.我的MSN是:junglesong_5@hotmail.com.



庞毅

2006-01-20 14:25

for(int i=0;i<list.size();i++){
                       item=(TaxItem)list.get(i);
                       
                       if(salary>item.getLimit()){
                               continue;
                       }
                       else{
                               break;
                       }
这段代码很有不错!学习了一下!多多交流!
pytruth1002@gmail.com


2006-01-22 09:23 网址: http://junglesong.ycool.com/

to 庞毅:
欢迎常来讨论。
junglesong@gmail.com



chen

2007-03-04 11:14

基础和面向对象的编程思想是编程的基础


评论 / 个人网页 / 扔小纸条
* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 


 

分类小组论坛
杂谈 , 娱乐、八卦 , 文学、艺术 , 体育 , 旅游、同城 , 象牙塔 , 情感 , 时尚、生活 , 星座 , 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定