如何使用 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.accounts
是 List
个 Account
对象,您的代码无法正常工作。
您可以使用 Stream.anyMatch
检查是否存在具有传入帐号的 Account
。
anyMatch
相对于循环的主要优点是,它是短路的,它不会计算流中的所有元素,它会在第一次匹配时 return。
根据 anyMatch
的 Java 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>
,这样您就可以在编译时捕获此类错误。
您好,我有一个数组 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.accounts
是 List
个 Account
对象,您的代码无法正常工作。
您可以使用 Stream.anyMatch
检查是否存在具有传入帐号的 Account
。
anyMatch
相对于循环的主要优点是,它是短路的,它不会计算流中的所有元素,它会在第一次匹配时 return。
根据 anyMatch
的 Java 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>
,这样您就可以在编译时捕获此类错误。