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

时间:2019-03-07 15:12:32

标签: java arraylist collections contains

嗨,我有一个包含银行数据的数组类: 帐号,余额,帐户类型和状态。 该数组是使用构造函数构建的:

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

2 个答案:

答案 0 :(得分:1)

您正在将一个帐户与一个帐户编号进行比较。代替此,您应该这样做。

public boolean checkAccountNumber(int a) {

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

答案 1 :(得分:0)

由于您传递的是int对象中的Bank.accounts,而ListAccount对象中的Stream.anyMatch,因此您的代码无法正常工作。

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

anyMatch相对于循环的主要优势在于,它短路,不会评估将在第一次匹配时返回的流的所有元素。

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

  

如果没有必要,则可能无法评估所有元素的谓词   确定结果。

示例代码:

Raw

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