Почему эта функция не может добавлять элементы в ArrayList, как следует? - PullRequest
2 голосов
/ 21 октября 2019

Я пытаюсь создать функцию, которая должна добавить элемент в 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 значений (имя, номер, баланс), оно не принимает его. Я не понимаю

edit;

    @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);
    }

Ответы [ 3 ]

1 голос
/ 21 октября 2019

Из ArrayList.contains (Объект o) javadoc :

Возвращает true, если этот список содержит указанный элемент. Более формально, возвращает true, если и только если этот список содержит хотя бы один элемент e такой, что (o == null? E == null: o.equals (e)).

Это означает,чтобы ваш метод работал правильно, вы должны реализовать метод hashcode / equals в классе Account.

Я создал фиктивную реализацию вашего кода:

Нет хэш-кода / равноопределенный метод -> Используемый по умолчанию хеш-код / ​​метод равенства класса объекта, который обрабатывает каждый новый объект по-разному.

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));

        }

}

Результат:
добавлен счет: верно
добавлен счет5: верно
account2 добавлено: true
account3 добавлено: true
account4 добавлено: true
account6 ​​добавлено: true

Что, очевидно, неверно.

Если вы добавите следующие методы хэш-кода / равно в класс 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;
}  

Результат будет:
добавлен аккаунт: true
account5 добавлено: false
account2 добавлено: true
account3 добавлено: false
account4 добавлено: true
account6 ​​добавлено: false

Таким образом, ваш метод будет работать правильно,

0 голосов
/ 21 октября 2019

Я не знаю, что происходит, но я пересоздал вашу программу, и она работает как положено. Возможно, проблема в логике вашего отделения банка. Я не переопределял HashCode (), но это хорошая привычка.

    public class BankingDemo {

       public static void main(String[] args) {
          Bank bank = new Bank();
          Account account = new Account("aucchQitgyzLV", 6329668, 479389.0);
          System.out.println(bank.addAccount(account));
          System.out.println(bank.getList());
          System.out.println(bank.addAccount(account));
          System.out.println(bank.getList());
          account = new Account("new account", 29228, 29202.2);
          System.out.println(bank.addAccount(account));
          System.out.println(bank.addAccount(account));
          System.out.println(bank.getList());

       }
    }

    class Account {
       String AccountName;
       int    AccountNumber;
       double AccountBalance;

       public Account() {
       }

       public Account(String accountName, int accountNumber,
             double accountBalance) {
          this.AccountName = accountName;
          this.AccountNumber = accountNumber;
          this.AccountBalance = accountBalance;
       }
       @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);
       }
       @Override
       public String toString() {
          return "{" + AccountName + "," + AccountNumber + "," + AccountBalance
                + "}";
       }
    }

    class Bank {

       private ArrayList<Account> accountList = new ArrayList<>();

       public Bank() {
       }

       public boolean addAccount(Account account) {
          if (!accountList.contains(account)) {
             accountList.add(account);
             return true;
          }
          return false;
       }

       public List<Account> getList() {
          return accountList;
       }
    }
0 голосов
/ 21 октября 2019

После того как ваши правки равны, ваш код должен работать как положено.

Вместо использования list и проверки на наличие дубликатов с помощью содержимого вы можете java.util.Set. Он не допускает дублирование.
Если вы хотите сохранить последовательность вставки, используйте вместо нее LinkedHashSet. Он сохраняет порядок вставок и запрещает дублирование. Все, что вам нужно сделать, это переопределить equals и hashcode.

import java.util.LinkedHashSet;
import java.util.Set;
public class Bank {
private Set<Account> accountList= new LinkedHashSet<>();

public Bank() {
}

public boolean addAccount(Account account) {
    if(!accountList.contains(account)) {
        accountList.add(account);
        return true;
    }
    return false;
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...