java - 为什么这个函数不能像它应该的那样向 ArrayList 添加项目?

标签 java function arraylist

我正在尝试创建一个函数,如果 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/

相关文章:

java - 如何更新我的 Android 应用程序中的 SSL 证书?

java - 编写一个简单的 ofx4j 程序

java - 使用比较器获取集合的子集

c# - Arraylist 在从磁盘加载后无法比较对象

java - ArrayList .contains() 有时为真,有时为假

java.lang.IllegalStateException : No JTA UserTransaction available

python - 将相同的函数与不同的参数组合起来 - Python

function - Vala 中的异步函数 - yield 和回调

php - 将 php 函数的返回值传递给 mysql_query

java - java中使用ArrayList的indexOf()