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))
要检查,如果相同的帐户有两个不同的账号 - accountNumber
和newAccountNumber
。这永远不会是真的。
您必须找到两个账户,一个账户是第一个账户,另一个账户是第二个账户。
简易方法做到这一点是一个嵌套的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是密钥且帐户是该值)的情况下会更有效。
答
if(bList.get(i).getAccountNumber().equals(accountNumber)&& bList.get(i).getAccountNumber().equals(newAccountNumber))
您正在检查这两种情况下的相同元素(均为位置i
)。 账号可能永远不会是accountNumber
和newAccountNumber
在同一时间。
答
正如@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
}
}
}
我试图用两种不同的IT satements cheking但它给了我尝试做同样的answere – GI88Z
一个依偎的循环,但它仍然给了我相同的答案 – GI88Z
@ GI88Z在这种情况下,您正在查找的帐户中至少有一个不在列表中。 – Eran