If-satement and loop in object arraylist

问题描述:

我在做一个学校项目,我模拟一个简单的银行系统,用户创建账户并可以存入,转账和删除账户。If-satement and loop in object arraylist

该方法的交易应该通过arraylist,找到第一个帐户和第二个帐户,并转移资金,但它跳转的代码,并说该帐户找不到。怎么可能解决这个问题

下来下面的代码显示了该方法

public boolean transaction(String accountNumber, String newAccountNumber, double amount){ 
    for(int i = 0; i < bList.size(); i++){ 
     if(bList.get(i).getAccountNumber().equals(accountNumber)&& bList.get(i).getAccountNumber().equals(newAccountNumber)){ 
      bList.get(i).deposit(-amount); 
      deposit(newAccountNumber, amount); 
      return true; 
     } 
     else if(bList.get(i).getBalance()< amount){ 
      JOptionPane.showMessageDialog(null, "Du har inte tillräckligt med pengar"); 
      return false; 
     } 
     else if(!bList.get(i).getAccountNumber().equals(newAccountNumber) && bList.get(i).getAccountNumber().equals(accountNumber)){ 
      JOptionPane.showMessageDialog(null, "Kontot finns inte "); 
      return false; 
     } 
     else if(!bList.get(i).getAccountNumber().equals(newAccountNumber)){ 
      JOptionPane.showMessageDialog(null, "kontot finns inte"); 
      return false; 
     } 
     else if(!bList.get(i).getAccountNumber().equals(accountNumber)){ 
      JOptionPane.showMessageDialog(null, "Kontot finns inte"); 
      return false; 
     } 


    } 
    return false; 
} 

第一个if语句应该检查是否两个帐户exsist并从有资金的账户转移资金会发生什么用户选择的帐户,但它跳过if语句并表示没有帐户。

if(bList.get(i).getAccountNumber().equals(accountNumber)&& bList.get(i).getAccountNumber().equals(newAccountNumber)) 

要检查,如果相同的帐户有两个不同的账号 - accountNumbernewAccountNumber。这永远不会是真的。

您必须找到两个账户,一个账户是第一个账户,另一个账户是第二个账户。

简易方法做到这一点是一个嵌套的for循环:

for(int i = 0; i < bList.size(); i++){ 
    for(int j = 0; j < bList.size(); j++){ 
     if(bList.get(i).getAccountNumber().equals(accountNumber) && bList.get(j).getAccountNumber().equals(newAccountNumber)) { 
      .... 
     } 
    } 
} 

但会采取O(n^2)时间。将帐户存储在HashMap(帐户ID是密钥且帐户是该值)的情况下会更有效。

+0

我试图用两种不同的IT satements cheking但它给了我尝试做同样的answere – GI88Z

+0

一个依偎的循环,但它仍然给了我相同的答案 – GI88Z

+0

@ GI88Z在这种情况下,您正在查找的帐户中至少有一个不在列表中。 – Eran

if(bList.get(i).getAccountNumber().equals(accountNumber)&& bList.get(i).getAccountNumber().equals(newAccountNumber)) 

您正在检查这两种情况下的相同元素(均为位置i)。 账号可能永远不会是accountNumbernewAccountNumber在同一时间。

正如@eran写道,你有一个明显的错误检查,如果该帐户同时具有accountNumber和newAccountNumber这当然只会是真实的,如果你交易来往于同一个帐户。

我认为,如果你重构代码一点会比较简单调试你的错误:

public boolean transaction(String accountNumber, String newAccountNumber, double amount){ 
    Account fromAccount = getAccount(accountNumber); 
    Account toAccount = getAccount(newAccountNumber); 

    if (fromAccount == null || toAccount == null) { 
      // At least one of the accounts is missing 
      JOptionPane.showMessageDialog(null, "Kontot finns inte "); 
      return false; 
    } else if (fromAccount.getBalance() < amount) { 
      // Not enough funds 
      JOptionPane.showMessageDialog(null, "Du har inte tillräckligt med pengar"); 
      return false; 
    } else { 
      fromAccount.deposit(-amount); 
      deposit(newAccountNumber, amount); 
      return true; 
    } 
    return false; 
} 

public Account getAccount(String accountNumber) { 
    for (int i = 0; i < bList.size(); i++){ 
     if(bList.get(i).getAccountNumber().equals(accountNumber) { 
      return bList.get(i); 
     } 
    } 
    return null; // No account matches 
} 

你的搜索逻辑是不对的,你正在检查的同一帐户对象,如果它有两个账号。

您可以使用嵌套的每个搜索特定帐户的帐号对象的ArrayList:

for(Account account : bList) { 
    for(Account newaccount : bList) { 
     if(account.getAccountNumber().equals(accountNumber) && newaccount.getAccountNumber().equals(newAccountNumber)){ 
      //account matches 
     } 
    } 
}