TaxRateTable.java
上传用户:yinzh02
上传日期:2021-05-28
资源大小:63k
文件大小:7k
源码类别:

家庭/个人应用

开发平台:

Java

  1. /*
  2.  * %W% %E% Rongzhi Liu
  3.  * 
  4.  * Copyright (c) 2008 Rongzhi-Liu SUN YAT-SEN UNIVERSITY. All Rights Reserved.
  5.  * 
  6.  * This software is to calculate personal tax.
  7.  * To make its use wider, the base of tax and the Tax Rate Table can be change
  8.  * is necessary.
  9.  */
  10. package personaltax;
  11. import java.util.ArrayList;
  12. import java.util.Collections;
  13. import java.util.Comparator;
  14. import myException.OutOfRangException;
  15. import myException.TableIllegalException;
  16. /**
  17.  * class TaxRateTable contains the infomation of all the tax's ranks rate.
  18.  * 
  19.  * @version 1.0 09 March 2008
  20.  * @author Rongzhi-Liu
  21.  */
  22. public class TaxRateTable {
  23.     
  24.     /** 
  25.      * Custom Comparator, using it to sort the Tax Rate Table.
  26.      */
  27.     private class MyComparator implements Comparator<Rate>{
  28.         public int compare(Rate o1, Rate o2) {
  29.             Rate r1 = (Rate)o1;
  30.             Rate r2 = (Rate)o2;
  31.             
  32.             if(r1.getStart() > r2.getStart())
  33.                 return 1;
  34.             else
  35.                 return 0;
  36.         }
  37.     }
  38.     
  39.     /** The number of tax rank. */
  40.     private int nRank;
  41.     
  42.     /** The infomation of all the tax ranks. */
  43.     private ArrayList<Rate> rate = new ArrayList<Rate>();
  44.     
  45.     /** Total tax for the level. */
  46.     private double[] fullRate;
  47.    
  48.     /** Default constructor. Create the TaxRateTable with default tax rate. */
  49.     public TaxRateTable(){
  50.         nRank = 5;
  51.    
  52.         rate.add(new Rate(0,0.05));
  53.         rate.add(new Rate(500,0.1));
  54.         rate.add(new Rate(2000,0.15));
  55.         rate.add(new Rate(5000,0.2));
  56.         rate.add(new Rate(20000,0.25));
  57.         
  58.         calFullRate();
  59.     }
  60.     
  61.     /** Constructor. Create the TaxRateTable with customer's tax rate. */
  62.     public TaxRateTable(int n, double startAndRate[][]){
  63.         nRank = n;
  64.         
  65.         for(int i = 0; i < n; i++){
  66.             rate.add(new Rate(startAndRate[i][0],startAndRate[i][1]));
  67.         }
  68.         
  69.         calFullRate();
  70.     }
  71.     
  72.     /**
  73.      * Calculate the Full Rate Tax before Rank i;
  74.      */
  75.     private void calFullRate(){
  76.         fullRate = new double[nRank];
  77.         fullRate[0] = 0;
  78.         for(int i = 1; i < nRank; i++){
  79.             fullRate[i] = fullRate[i-1] +
  80.                           (((Rate)rate.get(i)).getStart() - ((Rate)rate.get(i-1)).getStart())
  81.                           * ((Rate)rate.get(i-1)).getRate();
  82.         }
  83.     }
  84.    
  85.     /**
  86.      * Sort the Tax Rate Table with the starting money.
  87.      */
  88.     private void sortTaxRateTable(){
  89.         
  90.         Comparator comp = new MyComparator();
  91.         Collections.<Rate>sort(rate,comp);
  92.     }
  93.     /**
  94.      * Test if the Tax Rate Table is legal.
  95.      * 
  96.      * @return If the Table is legal, return true, else return false.
  97.      */
  98.     private boolean test(){
  99.         
  100.         sortTaxRateTable();
  101.         for(int i=0; i<nRank-1; i++){
  102.             if(((Rate)rate.get(i)).getStart() == ((Rate)rate.get(i+1)).getStart() ||
  103.                     ((Rate)rate.get(i)).getRate() >= ((Rate)rate.get(i+1)).getRate()){
  104.                 return false;
  105.             }
  106.         }
  107.         return true;
  108.     }
  109.  
  110.     /**
  111.      * Insert an Rank to the Tax Rate Table.
  112.      * 
  113.      * @param s New Rank's starting money.
  114.      * @param r New Rank's rate.
  115.      */
  116.     public void insertRank(double s, double r) throws TableIllegalException{
  117.         
  118.         rate.add(new Rate(s,r));
  119.         if(!test()){
  120.             rate.remove(new Rate(s,r));
  121.             throw new TableIllegalException();
  122.         }
  123.         ++nRank;
  124.         calFullRate();
  125.     }
  126.     
  127.     /**
  128.      * Delete a Rank in the Tax Rate Table.
  129.      * 
  130.      * @param i The index of the Rank to be deleted.
  131.      */
  132.     public void deleteRank(int i) throws OutOfRangException{
  133.         
  134.         if(i <= 0 || i > nRank){
  135.             throw new OutOfRangException(nRank);
  136.         }
  137.         
  138.         rate.remove(i-1);
  139.         --nRank;
  140.     }
  141.     
  142.     /**
  143.      * Change rank i, including starting money and rate.
  144.      * 
  145.      * @param i Index of rank.
  146.      * @param s Rank(i)'s new starting money.
  147.      * @param r Rank(i)'s new rate.
  148.      * @throws myException.OutOfRangException
  149.      * @throws myException.TableIllegalException
  150.      */    
  151.     public void changeRank(int i, double s, double r)
  152.             throws OutOfRangException, TableIllegalException{
  153.         
  154.         if(i > nRank){
  155.             throw new OutOfRangException(nRank);
  156.         }
  157.         
  158.         Rate tmp = (Rate)rate.get(i-1);
  159.         
  160.         rate.set(i-1, new Rate(s,r));
  161.         if(!test()){
  162.             rate.remove(new Rate(s,r));
  163.             rate.add(tmp);
  164.             sortTaxRateTable();
  165.             throw new TableIllegalException();
  166.         }
  167.         calFullRate();
  168.     }
  169.     
  170.     /**
  171.      * Override toString()
  172.      * 
  173.      * @return Fomated Tax Rate Table
  174.      */
  175.     @Override
  176.     public String toString(){
  177.         String table = "* * * * * * * * * * * * *n";
  178.         table += "* RanktStartt  Ratet*n";
  179.         for(int i=0; i<nRank; i++){
  180.             table += "*  " + (i + 1) + "t" + (Rate)rate.get(i) + "t*n";
  181.         }
  182.         table += "* * * * * * * * * * * * *n";
  183.         return table;
  184.     }
  185.     
  186.      /** 
  187.      * Calculate the tax.
  188.      * 
  189.      * @param AmountOfTax Money that should be taxed.
  190.      * @return The tax.
  191.      */
  192.     public double calculate(double amountOfTax){
  193.         int i;
  194.         for(i = 0; i < nRank; i++){
  195.             if(amountOfTax <= ((Rate)rate.get(i)).getStart()){
  196.                 break;
  197.             }
  198.         }
  199.         
  200.         return (fullRate[i-1]
  201.                 + (amountOfTax - ((Rate)rate.get(i-1)).getStart())
  202.                 * ((Rate)rate.get(i-1)).getRate()); 
  203.     }
  204.     
  205.     /**
  206.      * Main Function. Use for Regression testing.
  207.      * @param Args
  208.      */
  209.     
  210.     public static void main(String[] args){
  211.         
  212.         System.out.println("Class Tax Rate Table testing.....");
  213.         
  214.         TaxRateTable t = new TaxRateTable();
  215.         
  216.         System.out.println("Current Table:");
  217.         System.out.print(t);
  218.         try{
  219.             System.out.println("Insert (800,0.12)");
  220.             t.insertRank(800, 0.12);
  221.             System.out.println(t);
  222.             
  223.             System.out.println("Delete rank(6)");
  224.             t.deleteRank(6);
  225.             System.out.println(t);
  226.             
  227.             System.out.println("Change Rank(4,3000,0.18)");
  228.             t.changeRank(3,3000,0.18);
  229.             System.out.println(t);
  230.             
  231.             System.out.println("Error Testing...");
  232.             System.out.println("Insert (1000,0.3)");
  233.             t.insertRank(1000, 0.3);
  234.             System.out.println(t);
  235.             
  236.         }catch(TableIllegalException e){
  237.             e.printStackTrace();
  238.         }catch(OutOfRangException e){
  239.             e.printStackTrace();
  240.         }
  241.         System.out.print(t);
  242.     }
  243. }