代码:
ArrayList<Employer> use = new ArrayList<Employer>();
ArrayList<String> Alia = new ArrayList<String>();
int moneyE, moneyF;
String Alias = "";
boolean alert, alertF;
for(int i = 0; i < Filers.size(); i++)
{
moneyE=0;
use.clear();
Alia.clear();
Alias = "";
alert = false; alertF = false;
use.addAll(this.findEmployerRecords(Filers.get(i)));
moneyF = Filers.get(i).getIncome();
for(int j = 0; j< use.size(); j++)
{
moneyE += use.get(j).getEmployeeWages();
if(!(Filers.get(i).getName().equals(use.get(j).getEmployeeName()))
&& !(Alia.contains(use.get(j).getEmployeeName())))
Alia.add(use.get(j).getEmployeeName());
if(moneyE !=moneyF
&& !(Filers.get(i).getName().substring(0, Filers.get(i).getName().indexOf(" ")+1).equals(
use.get(j).getEmployeeName().substring(0, use.get(j).getName().indexOf(" ")+1)))) //problem occurs here
alert = true;
if (alert = true)
alertF = true;
}
for(int j=1; j<Alia.size();j++)
Alias+= (", " + Alia.get(j));
if (moneyE != moneyF)
Discrepancies.add(new Discrepancy(alertF, moneyF-moneyE, Filers.get(i).getName(),
Filers.get(i).getSSN(), Alias));
}
我在我的结尾。我无法弄清楚我在这里做错了什么。这是我正在使用的一些代码来创建虚拟IRS。如果我在问题点删除+1,我会得到一个超出范围的异常。我遇到的问题是警报和警报.F。如果moneyE和moneyF不匹配并且雇主记录和申报者之间的姓氏拼写不同,则警报状态应该消失。警报以星号显示。
预期:
*-100, HEATON MARK, 309582302, MCGUIRE MARK
*-50, FOX CHARLES, 724113610, BOX CHARLES
+105, MOFFITT DONALD, 206516583, MOFFITT DON
+100, YOUNG THOMAS, 813068590, YOUNG THOM, YOUNG TOM
-20, SOMASUNDAR PRASANTH, 138001926
+5, HORSLEY MARIA, 239984300
+5, LIANG BO, 743287509
+5, LIANG BO, 857410861
实际值:
*105, MOFFITT DONALD, 206516583
*-100, HEATON MARK, 309582302, HEATON MARK
*100, YOUNG THOMAS, 813068590, YOUNG TOM
*-50, FOX CHARLES, 724113610
*-20, SOMASUNDAR PRASANTH, 138001926
*5, HORSLEY MARIA, 239984300
*5, LIANG BO, 743287509
*5, LIANG BO, 857410861
答案 0 :(得分:0)
通过取消对同一对象的重复调用来简化您的代码,即您在逻辑中有多次调用Filers.get(i)
。摘要这些是为了提高代码的可读性。
你也有许多不是陈述,想想你的逻辑。
提示:!A & !B = ! (A | B)
以下是您的代码的简化,易于阅读的版本。
alert = false;
alertF = false;
Filer f = Filers.get(i);
use.addAll(this.findEmployerRecords(f));
moneyF = f.getIncome();
String filersName = f.getName();
for(int j = 0; j< use.size(); j++)
{
moneyE += use.get(j).getEmployeeWages();
String emplName = use.get(j).getEmployeeName();
if(!(filersName.equals(emplName) || Alia.contains(emplName)))
Alia.add(emplName );
if(!(moneyE == moneyF || filersName.substring(0, filersName.indexOf(" ")+1).equals(
emplName.substring(0, use.get(j).getName().indexOf(" ")+1)))) //problem occurs here
alert = true;
if (alert = true)
alertF = true;
}
for(int j=1; j<Alia.size();j++)
Alias+= (", " + Alia.get(j));
if (moneyE != moneyF)
Discrepancies.add(new Discrepancy(alertF, moneyF-moneyE, filersName, f.getSSN(), Alias));
为了帮助您了解出现了什么问题,请添加一些类似的打印语句
System.out.println("i=" + i + ", j=" + j + ", fName="+ filersName + ", index= "+ filersName.indexOf(" ") + ", substing= "+ filersName.substring(0, filersName.indexOf(" ")+1));
在你的逻辑陈述之前。还要为您要比较的雇主名称添加一个。
这一行还有一个很大的问题
if (alert = true)
始终将警报变量设置为true - 不进行比较,因为您只有一个=
。实际上,您不需要在逻辑语句中比较布尔值
if (A == true)
相当于if(A)
更好的是你可以只有一个布尔值。你的代码是这样的
if(/*Condition*/)
alert = true;
if (alert)
alertF = true;
可以替换为
if(/*Condition*/)
alertF = true;