📄 taxtable.java
字号:
package calculator;
import java.io.*;
import java.util.*;
import exception.BoundsException;
/**
* 这个类表示TaxTable,整个数据存储的核心,可以对税率表进行各种操作
* @author ZiHi
* TaxTable是存储税率表的类,其中由TaxRow通过ArrayList构成
* @param boolean original 表示表有没有被修改过
* @param int base 表示税率的起征点
* @param ArrayList talbe 是ArrayList类型,用于存储税率表
* @param int rank 用于表示一共有多少级税率
*/
public class TaxTable {
boolean original;
int base;
public ArrayList<TaxRow> table;
public int rank;
File f;
/**
* TaxTable的构造函数,主要进行数据的读入,ArrayList的初始化和各参数的初始化
* 其中加入了文件读取失败的保护机制
*/
public TaxTable(){
original=true;
try{
f = new File("TaxTable.txt");
BufferedReader inputStream = new BufferedReader (new InputStreamReader(new FileInputStream(f)));
table= new ArrayList<TaxRow>();
String line = inputStream.readLine();
base=Integer.parseInt(line);
line = inputStream.readLine();
rank=Integer.parseInt(line);
int i;
for(i=0;i<rank;i++){
StringTokenizer st =new StringTokenizer(inputStream.readLine());
int tlevel=Integer.parseInt(st.nextToken());
double trate=Double.parseDouble(st.nextToken());
TaxRow temp=new TaxRow(tlevel,trate);
table.add(i, temp);
}
rank=table.size();
}
catch(FileNotFoundException e){}
catch(IOException e){}
}
/**
* TaxTable的构造函数,通过另一个对象来初始化
* @param TaxTable temp 接收的对象参数
*/
public TaxTable(TaxTable temp){
base=temp.base;
table=temp.table;
rank=temp.rank;
}
/**
* Save函数主要用于保存表格的变化,这里会检测表格有没有被用户更改,当用户退出
* 的时候询问是否保存表格,如果是的话新表格将存入文件,如果没有改变的话会提示
* 用户此表不需要保存,此处应注意即使用户进行了操作没有改变表格,仍然需要保存
* 最后会有操作成功与否的提示
*/
public void Save()
{
if(original==false){
PrintWriter outputStream = null;
try{
outputStream =
new PrintWriter (new FileOutputStream(f));
}catch(FileNotFoundException e){}
outputStream.println(base);
outputStream.println(rank);
int i;
for(i=0;i<rank;i++){
outputStream.println(table.get(i).level+" "+table.get(i).rate);
}
outputStream.close();
System.out.println("The taxtable h saved!");
}
else {System.out.println("The taxtable need'nt to be saved!");}
}
/**
* SetRank 函数用于设置某一级别的税率基点和税率
* @param trank 是用户输入的想要更改的级别
* @param tlevel 是用于输入的想要更改的基点
* @param trate 是用于输入的想要更改的税率
* @exception BoundsException 用于指出用户输如的信息应该在允许的范围内
* @exception BoundsException 还可以指出输入的级别不存在
*/
public void SetRank(int trank,int tlevel,double trate){
try{
TaxRow tt1=(TaxRow)table.get(trank-2);
TaxRow tt2=(TaxRow)table.get(trank);
if(trank>0&&trank<=rank){
if(tlevel>tt1.level&&tlevel<tt2.level){
if(trate>tt1.rate&&trate<tt2.rate)
table.set(trank-1,new TaxRow(tlevel,trate));
else throw new BoundsException(tt1.rate,tt2.rate);
}
else throw new BoundsException(tt1.level,tt2.level);
}
else throw new BoundsException("rank");
}
catch (BoundsException e){}
original=false;
return;
}
/**
* AddRank 函数用于增加某一级别的税率基点和税率,这里程序会自动定位所需插入的级别
* @param tlevel 是用于输入的想要更改的基点
* @param trate 是用于输入的想要更改的税率
* @exception BoundsException 用于指出用户输如的信息应该在允许的范围内
* @exception BoundsException 还可以指出输入的某个级别基点已经存在
*/
public void AddRank(int tlevel,double trate){
try{
if(tlevel==0) throw new BoundsException("level");
int i=1;
TaxRow tt=(TaxRow)table.get(rank-i);
if(tlevel>tt.level){
table.add(new TaxRow(tlevel,trate));
rank++;
original=false;
return ;
}
if(tlevel==tt.level){}
while(tlevel<tt.level){
i++;
tt=(TaxRow)table.get(rank-i-1);
}
TaxRow tt1=(TaxRow)table.get(rank-i);
if(tlevel>tt.level&&tlevel<tt1.level){
TaxRow t1=(TaxRow)table.get(rank-i);
if(trate<t1.rate&&trate>tt.rate){
table.add(rank-i, new TaxRow(tlevel,trate));
rank++;
}
else throw new BoundsException(tt.rate,t1.rate);
}
else throw new BoundsException("level");
}
catch (BoundsException e){}
original=false;
return;
}
/**
* DeletRank 函数用于删除某一级别的税率基点和税率
* @param tr 是用户想要删除的级别
* @exception BoundsException 可以指出用户输入的级别不存在
*/
public void DeletRank(int tr){
try{
if(tr>0&&tr<=rank)
{
table.remove(tr-1);
rank--;
}
else throw new BoundsException(1,rank);
}
catch (BoundsException e){}
original=false;
}
public String toString(){
return ("The total rank is "+rank+"\n"
+"The tax base is "+base+"\n"
);
}
/**
* Show 函数用于列出税率表的全部内容,其中通过使用toString函数
*/
public void Show()
{
System.out.println(".........The tax table...........");
int i;
System.out.print(toString());
for(i=1;i<=rank;i++)
{
System.out.println("Rank "+i+": >"+table.get(i-1).toString()+"%");
}
System.out.println(".................................");
}
public static void main(String args[]) throws IOException
{
TaxTable testTable=new TaxTable();
System.out.println("Now runinng the taxtable test program!");
testTable.Show();
System.out.println("Now test save!");
testTable.Save();
System.out.println("Now test add! add level=600 rate=9");
testTable.AddRank(600,9);testTable.Show();
System.out.println("Now test add! add level=600 rate=15");
testTable.AddRank(600,15);testTable.Show();
System.out.println("Now test add! add level=600 rate=10");
testTable.AddRank(600,10);testTable.Show();
System.out.println("Now test add! add level=600 rate=16");
testTable.AddRank(600,16);testTable.Show();
System.out.println("Now test add! add level=600 rate=11");
testTable.AddRank(600,11);testTable.Show();
System.out.println("Now test delete! delete rank=6");
testTable.DeletRank(6);testTable.Show();
System.out.println("Now test delete! delete rank=6");
testTable.DeletRank(6);testTable.Show();
System.out.println("Now test add! add level=20000 rate=25");
testTable.AddRank(20000,25);testTable.Show();
System.out.println("Now test set! set rank=3 level=500 rate=11");
testTable.SetRank(3, 500, 11);testTable.Show();
System.out.println("Now test set! set rank=3 level=2000 rate=11");
testTable.SetRank(3, 2000, 11);testTable.Show();
System.out.println("Now test set! set rank=3 level=499 rate=11");
testTable.SetRank(3, 499, 11);testTable.Show();
System.out.println("Now test set! set rank=3 level=2001 rate=11");
testTable.SetRank(3, 2001, 11);testTable.Show();
System.out.println("Now test set! set rank=3 level=700 rate=9");
testTable.SetRank(3, 700, 9);testTable.Show();
System.out.println("Now test set! set rank=3 level=700 rate=15");
testTable.SetRank(3, 700, 15);testTable.Show();
System.out.println("Now test set! set rank=3 level=700 rate=10");
testTable.SetRank(3, 700, 10);testTable.Show();
System.out.println("Now test set! set rank=3 level=700 rate=16");
testTable.SetRank(3, 700, 16);testTable.Show();
System.out.println("Now test set! set rank=3 level=700 rate=12");
testTable.SetRank(3, 700, 12);testTable.Show();
System.out.println("delete rank=3");
testTable.DeletRank(3);testTable.Show();
System.out.println("Now test save!");
testTable.Save();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -