簡體   English   中英

如何不將重復項添加到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類的重復項,為什么不創建一個唯一的標識符(主鍵)呢?

是來自數據庫的數據還是只是靜態輸入而已? 如果它來自數據庫,那么主鍵就可以了。 否則,只需將主鍵屬性添加到模型中,然后檢查是否有任何帳戶具有相同的主鍵。

如何在 ArrayList 中查找重復項<object> ?<div id="text_translate"><p> 這是一個很常見的問題,但我找不到這部分:</p><p> 假設我有這個數組列表:</p><pre> List&lt;MyDataClass&gt; arrayList = new List&lt;MyDataClass&gt;; MyDataClass{ String name; String age; }</pre><p> 現在,我需要根據MyDataClass中的age查找重復項並將其刪除。 如何使用<a href="http://www.javadb.com/remove-duplicate-items-from-an-arraylist" rel="nofollow">此處</a>描述的 HashSet 之類的東西?</p><p> 我想,我們需要覆蓋 MyDataClass 中的equals嗎?</p><ol><li> 但是,如果我沒有這樣做的奢侈呢?</li><li> 而HashSet實際上是如何在內部找到並且不添加重復項的? 我<a href="http://www.google.com/codesearch#TTY8xLpnKOE/src/share/classes/java/util/HashSet.java&amp;q=HashSet&amp;type=cs&amp;l=103" rel="nofollow">在 OpenJDK 中</a>看到了它的實現,但無法理解。</li></ol></div></object>

[英]How to find duplicates in an ArrayList<Object>?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 如何從 ArrayList 的 ArrayList 中刪除重復的 ArrayList 如何在 ArrayList 中查找重復項<object> ?<div id="text_translate"><p> 這是一個很常見的問題,但我找不到這部分:</p><p> 假設我有這個數組列表:</p><pre> List&lt;MyDataClass&gt; arrayList = new List&lt;MyDataClass&gt;; MyDataClass{ String name; String age; }</pre><p> 現在,我需要根據MyDataClass中的age查找重復項並將其刪除。 如何使用<a href="http://www.javadb.com/remove-duplicate-items-from-an-arraylist" rel="nofollow">此處</a>描述的 HashSet 之類的東西?</p><p> 我想,我們需要覆蓋 MyDataClass 中的equals嗎?</p><ol><li> 但是,如果我沒有這樣做的奢侈呢?</li><li> 而HashSet實際上是如何在內部找到並且不添加重復項的? 我<a href="http://www.google.com/codesearch#TTY8xLpnKOE/src/share/classes/java/util/HashSet.java&amp;q=HashSet&amp;type=cs&amp;l=103" rel="nofollow">在 OpenJDK 中</a>看到了它的實現,但無法理解。</li></ol></div></object> 如何防止對象ArrayList中的重復項 如何從 arraylist 中刪除重復項 ArrayList添加導致重復的內容 如何將新數據添加到Arraylist中以及如何刪除用戶輸入重復項? 如何在java中使用hashmap查找ArrayList中的重復項? 如何存儲一定數量的數組列表中的重復項 Java如何從ArrayList中刪除重復項 如何在自定義arraylist Java中制作重復列表
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM