我正在尝试创建一个函数,如果 ArrayList 中不存在该项目,则应将其添加到 ArrayList。
这是我目前拥有的。
账户类别:
public Account() {}
public Account(String accountName, int accountNumber, double accountBalance)
{
this.AccountName = accountName;
this.AccountNumber = accountNumber;
this.AccountBalance = accountBalance;
}
银行类:
private ArrayList<Account> accountList;
public Bank() {
}
public boolean addAccount(Account account) {
if(!accountList.contains(account)) {
accountList.add(account);
return true;
}
return false;
}
测试人员:
public class Main {
public static void main(String[] args){
Bank bank = new Bank("qLOwyONvKsM58ZdV& &yo", Bank.BranchLocations.values()[0]);
Account account = new Account("aucchQitgyzLV", 6329668, 479389.0);
System.out.println(bank.addAccount(account));
}
}
看起来我可以添加没有任何值的空帐户,但如果给定 3 个值的可选参数,(name,number,balance) 它不接受它。我不明白
编辑;
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Account acc = (Account) obj;
return AccountBalance == acc.AccountBalance &&
AccountNumber == acc.AccountNumber &&
AccountName.equals(acc.AccountName);
}
最佳答案
来自 ArrayList.contains(Object o) javadoc :
Returns true if this list contains the specified element. More formally, returns true if and only if this list contains at least one element e such that (o==null ? e==null : o.equals(e)).
这意味着,要使您的方法正常工作,您必须在 Account 类中实现 hashcode/equals 方法。
我已经为您的代码创建了一个模拟实现:
没有定义 hashcode/equals 方法 -> 使用对象类的默认 hashcode/equals 方法,它以不同的方式对待每个新对象。
import java.util.ArrayList;
import java.util.List;
public class Test{
static class Account {
private String AccountName;
private int AccountNumber;
private double AccountBalance;
public Account(String accountName, int accountNumber, double accountBalance)
{
this.AccountName = accountName;
this.AccountNumber = accountNumber;
this.AccountBalance = accountBalance;
}
public Account()
{
}
public String getAccountName() {
return AccountName;
}
public void setAccountName(String accountName) {
AccountName = accountName;
}
public int getAccountNumber() {
return AccountNumber;
}
public void setAccountNumber(int accountNumber) {
AccountNumber = accountNumber;
}
public double getAccountBalance() {
return AccountBalance;
}
public void setAccountBalance(double accountBalance) {
AccountBalance = accountBalance;
}
}
static class Bank {
private List<Account> accountList = new ArrayList<>();
private String inputStr = "";
private int inputInt = 0;
public Bank() {
}
public Bank(String string, int i) {
inputStr = string;
inputInt = i;
}
public boolean addAccount(Account account) {
if(!accountList.contains(account)) {
accountList.add(account);
return true;
}
return false;
}
}
public static void main(String[] args)
{
Bank bank = new Bank("qLOwyONvKsM58ZdV& &yo", 1);
Account account = new Account("aucchQitgyzLV", 6329668, 479389.0);
Account account5 = new Account("aucchQitgyzLV", 6329668, 479389.0);
Account account2 = new Account();
Account account3 = new Account();
Account account4 = new Account("sgdgrt", 0, 0.1);
Account account6 = new Account("sgdgrt", 0, 0.1);
System.out.println( "account added: "+bank.addAccount(account));
System.out.println("account5 added: "+bank.addAccount(account5));
System.out.println( "account2 added: "+bank.addAccount(account2));
System.out.println("account3 added: "+bank.addAccount(account3));
System.out.println("account4 added: "+bank.addAccount(account4));
System.out.println("account6 added: "+bank.addAccount(account6));
}
}
Result:
account added: true
account5 added: true
account2 added: true
account3 added: true
account4 added: true
account6 added: true
这显然是不正确的。
如果您要将以下 hashcode/equals 方法插入到 Account 类中:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
long temp;
temp = Double.doubleToLongBits(AccountBalance);
result = prime * result + (int) (temp ^ (temp >>> 32));
result = prime * result + ((AccountName == null) ? 0 : AccountName.hashCode());
result = prime * result + AccountNumber;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Account other = (Account) obj;
if (Double.doubleToLongBits(AccountBalance) != Double.doubleToLongBits(other.AccountBalance))
return false;
if (AccountName == null) {
if (other.AccountName != null)
return false;
} else if (!AccountName.equals(other.AccountName))
return false;
if (AccountNumber != other.AccountNumber)
return false;
return true;
}
Result would be:
account added: true
account5 added: false
account2 added: true
account3 added: false
account4 added: true
account6 added: false
所以你的方法会正常工作。
关于java - 为什么这个函数不能像它应该的那样向 ArrayList 添加项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58488823/