如何不允许在我的 ArrayList 中输入的字符串不再添加第二次



我有一个银行程序,有一个输入客户和余额方法。该方法向我的帐户 ArrayList 添加一个字符串和一个双精度值,例如,如果输入了名称 Sam,我想阻止再次输入该名称,因为目前它为 Sam 创建了两个单独的字符串和余额,并且在提取/存款时两者都被修改,因为我检查名称/字符串以获得正确的帐户。

class Bank {
ArrayList<Account> accounts = new ArrayList<Account>();
public void enterCustomers() {
String name = "";
double balance;
System.out.println("Enter customer names or q to quit entering names");
while (true) {
name = MyConsole.getString("Enter a customer name: ");
if (name.equals("q")) {
break;
}
balance = MyConsole.getDouble("Enter opening balance: ");
accounts.add(new Account(name, balance));
}
}

有很多方法可以做到这一点。这是我能想到的一种方法,需要对现有代码进行最少的修改:

name = MyConsole.getString("Enter a customer name: ");
if (name.equals("q")) {
break;
}
if (accounts.stream().anyMatch(x -> x.getName().equals(name))) {
System.out.println("This name already exists!"); 
continue;
}
balance = MyConsole.getDouble("Enter opening balance: ");
accounts.add(new Account(name, balance));

或者,覆盖equalshashCode中的Account,并将它们存储在HashSet<Account>中。然后,您可以以较低的时间复杂度检查某些内容是否已在集合中。

// in your Account class
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Account account = (Account) o;
return name.equals(account.name);
}
@Override
public int hashCode() {
return name.hashCode();
}
// in Bank class
HashSet<Account> accounts = new HashSet<>();
public void enterCustomers() {
String name = "";
double balance;
System.out.println("Enter customer names or q to quit entering names");
while (true) {
name = MyConsole.getString("Enter a customer name: ");
if (name.equals("q")) {
break;
}
balance = MyConsole.getDouble("Enter opening balance: ");
if (!accounts.add(new Account(name, balance))) {
System.out.println("This customer already exists!");
}
}
}

您是否已准备好使用带有帐户的数组?

存在其他数据结构,例如已筛选重复条目的"设置"。Set 根据 Set 中的元素检查要插入的对象的 equals 方法。在这种情况下,这意味着您必须在 Account 类中实现一个 equals 方法,该方法检查帐户的名称是否相等。

使用 java 8 你可以做到这一点

boolean nameExists = accounts.stream().anyMatch(account-> "name".equals(account.getName()));

或者另一种方法是将名称和余额存储为 HashMap 中的键值对,它有一个包含密钥的方法来检查密钥是否存在。

谢谢大家的评论!我应该提到我在计算机科学的第一学期,所以一切对我来说仍然很新,但现在我有更多的东西要学习哈哈。为了简单起见,我决定使用卡洛斯建议的 for 循环。

for (Account acc : accounts) { 
if (acc.getName().equals(name)) { 
System.out.println("That name already exists, please enter a different one."); 
continue;
} 

如果你不想使用重复的值,那么使用Set接口,它是java.util的一部分,并扩展java.util.Collection接口。它不允许使用重复元素,最多只能容纳一个空元素。

有关更多参考,请查看以下链接

在爪哇中设置

最新更新