2014-10-02 2 views
0

Код:некорректный вывод, и я не могу понять, почему

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 в проблемном месте, я получаю исключение. Проблема, с которой я столкнулась, - это предупреждение и alertF. Статус предупреждения должен быть отключен, если 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 

Actual:

*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 
+4

Вы должны подключить отладчик и шаг за шагом через код, чтобы увидеть, где ваша проблема. – mkobit

+1

Опубликуйте свое исключение с полной трассировкой стека. –

+0

В этом последнем цикле вы инициализируете 'j' до 1, может ли это быть? –

ответ

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) 

ВСЕГДА устанавливая переменную оповещения истина - не сравниваю, как и у вас есть только один =. На самом деле вам не нужно сравнивать булевы в логических операторов

if (A == true) эквивалентно if(A)

еще лучше, вы можете просто иметь один логическое значение. Ваш код, как этот

if(/*Condition*/) 
     alert = true; 
if (alert) 
     alertF = true; 

и может быть заменен только

if(/*Condition*/) 
     alertF = true; 
Смежные вопросы