如何使用 Contains 方法在 arraylist 中查找对象

How to find object in arraylist with the Contains method

您好,我有一个数组 class 用于保存银行数据: 帐号、余额、帐户类型和状态。 该数组是用构造函数构建的:

Bank.accounts.add(new Account(this.accNumber, this.type, this.balance, this.status));

当我尝试查找数字时(使用不同的方法),它没有找到。

该方法获取银行号码帐户的输入,然后将其与帐户数组列表进行比较。如果找到,将打开控制台界面,但它永远找不到帐号。 我已经尝试扫描整数、字符串到整数,并使用方法内部的 contains 方法或作为独立方法(如下例所示)但没有成功。

方法是:

public void accountActions() {

    System.out.println("Enter number of account for more info");
    Boolean isFinished = false;
    while (!isFinished) {
        try {

            String scan = input.nextLine();
            Bank.number = Integer.parseInt(scan);
            isFinished = true;
        } catch (NumberFormatException e) {
            System.out.println("Please enter again\n------------------------------");
            isFinished = false;
        } catch (InputMismatchException e) {
            System.out.println("Please enter again\n------------------------------");
            isFinished = false;
        }
    }
    if (checkAccountNumber(number) == true) {
        System.out.println("=====================================");
        System.out.println("=                                   =");
        System.out.println("=   Enter command number            =");
        System.out.println("=                                   =");
        System.out.println("=   1. Withdraw money               =");
        System.out.println("=   2. Deposit                      =");
        System.out.println("=   3. Total money in all accounts  =");
        System.out.println("=                                   =");
        System.out.println("=====================================");

    } else {
        System.out.println(
                "No account was found by that number, would you like to try again?\n(((Yes/No)))\n---------------");
        yesNo("accountActions");
    }
}

独立方法是:

public boolean checkAccountNumber(int a) {
    boolean check = false;
    if (Bank.accounts.contains(a)) {
        check = true;
    }
    return check;
}

您正在比较一个帐户和一个帐号。而不是这个,你应该这样做。

public boolean checkAccountNumber(int a) {

    for (Account account of Bank.accounts){
        if (account.accNumber.equals(a)) {
            return true;
        }
    }
    return false;
}

由于您传递的是 int,而 Bank.accountsListAccount 对象,您的代码无法正常工作。

您可以使用 Stream.anyMatch 检查是否存在具有传入帐号的 Account

anyMatch 相对于循环的主要优点是,它是短路的,它不会计算流中的所有元素,它会在第一次匹配时 return。

根据 anyMatchJava doc:

May not evaluate the predicate on all elements if not necessary for determining the result.

示例代码:

class Bank {
    static List<Account> accounts;
    ...
}
public boolean checkAccountNumber(int a) {
    return Bank.accounts.stream().anyMatch(acc -> acc.accNumber.equals(a)); 
}

您可以通过 而不是 使用 Raw 类型来避免这个问题。将您的 Bank.accounts 列表生成为 List<Account>,这样您就可以在编译时捕获此类错误。