[英]How to remove duplicates ArrayList from an ArrayList of ArrayList
[英]How to not add duplicates to an arrayList
如此簡短的概述我的工作:我應該寫一個使用我創建的帳戶類的ATM類。 (account類包含以下方法:打開-創建一個新帳戶,退出-退出當前帳戶,登錄-用戶登錄到他們的帳戶,存款,取款,獲取余額和終止-這會打破無限環)。 我的ATM類必須跟蹤所有已打開的帳戶,因此我想使用類型為account的數組列表。 但是由於某種原因,.contains()方法無法識別重復項,因此它會繼續添加已經存在的帳戶,而且我不確定如何解決此問題。 這是我的代碼:THANKS =)
我的帳戶類別:
導入java.util.ArrayList;
public class Account
{
public ArrayList<Account> accounts;
public static int NextAcctNo = 999;
private int accountNo;
private double balance;
public Account()
{ // constructor
balance = 0.0;
accountNo = ++NextAcctNo;
}
public void Open()
{
System.out.println("New account number: " + accountNo);
}
public void Quit()
{
System.out.println("Goodbye");
}
public void Login(int accountNo)
{
System.out.println("Hello");
this.accountNo = accountNo;
}
public void Deposit(double amount)
{ // method
balance += amount;
System.out.println("Deposited: " + amount);
}
public void Withdraw(double amount)
{ // method
balance -= amount;
System.out.println("Withdrew: " + amount);
}
public double Balance()
{ // method
System.out.println("Balance: " + balance);
return balance;
}
public void Terminate()
{
System.out.println("Terminated");
}
public int getAccountNo()
{ // method
return accountNo;
}
}//class Account
我的主要方法:
import java.util.Scanner;
import java.util.ArrayList;
public class ATM
{
// search for accounts for D, W, B
public static void main(String [] args)
{
ArrayList<Account> accounts = new ArrayList<Account>();
int counter = 0;
while (true)
{
Scanner commandScanner = new Scanner(System.in);
System.out.print("Enter a command - O, Q, L, D, W, B, T: ");
String command = commandScanner.nextLine();
if (command.equals("O") == true)
{
Account newAccount = new Account();
accounts.add(newAccount);
counter++;
newAccount.Open();
}
else if (command.equals("Q") == true)
{
if (accounts.size() == 0)
{
System.out.println("Error");
}
else
{
accounts.get(counter-1).Quit();
}
}
else if (command.equals("L") == true)
{
Scanner numberScanner = new Scanner(System.in);
System.out.println("Enter your account number: ");
int accountNo = numberScanner.nextInt();
Account temp = new Account();
temp.accountNo = accountNo;
if (counter == 0)
{
accounts.add(temp);
counter++;
}
else if (counter > 0)
{
if (accounts.contains(temp.accountNo) == true)
{
counter+=0;
}
else
{
Account newAccount = temp;
newAccount.Login(accountNo);
accounts.add(newAccount);
counter++;
System.out.println(accounts.size());
}
}
}
代碼仍在進行中,我還沒有全部發布-這就是為什么括號沒有全部關閉的原因。
ArrayList#contains
使用Object#equals
方法確定對象之間的相等性。 默認情況下,此簡單操作比較對象的內存位置( o1 == o2
)
您將需要重寫Account
類的equals
方法並比較(類似)帳戶ID
public class Account {
//...
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Account other = (Account) obj;
if (this.accountNo != other.accountNo) {
return false;
}
return true;
}
}//class Account
話雖如此,每次創建一個臨時Account
您都會自動增加帳號,這並不是真正需要的。
更好的解決方案是使用某種類型的Map
(以帳號為鍵),以便您可以簡單地執行以下操作...
Scanner numberScanner = new Scanner(System.in);
System.out.println("Enter your account number: ");
int accountNo = numberScanner.nextInt();
Account account = accountsMap.get(accountNo);
// Check for a null return result...
這確實意味着,每次創建一個Account
,都需要將其添加到Map
,因此可能需要某種工廠方法...
ps ...
在equals和hashCode
方法之間有一個契約鏈接,這通常意味着,當您覆蓋一個時,您應該覆蓋另一個
請注意,通常每當重寫此方法時,都必須重寫hashCode方法,以便維護hashCode方法的常規協定,該協定規定相等的對象必須具有相等的哈希碼
例如...
public class Account {
//...
@Override
public int hashCode() {
int hash = 5;
hash = 43 * hash + this.accountNo;
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Account other = (Account) obj;
if (this.accountNo != other.accountNo) {
return false;
}
return true;
}
}//class Account
也許剛剛過去了,但是如果您要查找Account類的重復項,為什么不創建一個唯一的標識符(主鍵)呢?
是來自數據庫的數據還是只是靜態輸入而已? 如果它來自數據庫,那么主鍵就可以了。 否則,只需將主鍵屬性添加到模型中,然后檢查是否有任何帳戶具有相同的主鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.