2011-07-18 26 views
0

我有一種將元素添加到arraylist的方法 我的任務是修改addProduct方法,以便無法將新產品 添加到具有相同ID的產品列表中 作爲現有的。將元素添加到arraylist並測試編號是否已存在

由於數字和字符串都在同一個單詞「項目」,並存儲在同一個索引,我不知道我怎麼才能得到的數字。我需要的數字來測試,看看這個數字是否已經存在

任何建議我應該怎麼做?

我添加到ArrayList的方法是這樣的下面:

(new Product(132, "Clock Radio")) 

public void addProduct(Product item) 
{ 
stock.add(item); 
} 
+0

嗯......代碼是無效的java。再試一次。 –

+0

@radder,你打開更改'股票'的類型設置?這將解決您的問題。 – Santosh

+0

你的意思是你有一個產品類型的對象,其中包含一些成員,你不知道如何訪問特定的成員? –

回答

4

我會大大推薦你去SetaddProduct()方法內。

從的Javadoc,

SET
不包含重複元素的集合。更正式地說,集合 不包含元素對e1和e2,使得e1.equals(e2)和 中最多一個爲null元素。

實現這樣的,

public static boolean checkDuplicate(ArrayList list) { 
HashSet set = new HashSet(); 
for (int i = 0; i < list.size(); i++) { 
    boolean val = set.add(list.get(i)); 
    if (val == false) { 
    return val; 
    } 
} 
return true; 
} 
+0

Downvoter。請注意評論。 –

+0

沒有解決這個問題:「既然數字和字符串都在同一個單詞」項目「中,並存儲在同一個索引中,我不知道我怎麼才能得到這個數字。」還需要您以其他方式可能不適用的方式實現「equals」和「hashCode」。並且你失去了廣告訂單。 – Thilo

+0

隨着收藏的增長,每次添加項目時迭代都會是一件代價昂貴的事情。 – Santosh

1
public void addProduct(Product item){ 
    for (Product p: stock) 
     if (p.getId() == item.getId()) 
     return; 
    stock.add(item); 
} 
+0

我嘗試使用第二個數組列表來添加產品項目,然後通過它循環獲取數字,但我又遇到了同樣的問題,我無法獲取該數字。 – radder

1

我會用一個java.util.Set中。您需要根據傳遞給構造函數的兩個字段來實現Product類的equals()和hashcode()方法。

+0

,但請注意,就目前而言,實現equals和hashCode的潛在副作用。誰知道在所有情況下產品是否應該被視爲平等。 – Thilo

1

嘗試使用一個HashMap,ID爲Key,Item爲Value。在HashMap中,你無法用相同的Key重複項目,所以你的問題在編程的底部被解決。 :)

+0

這種方式你失去了插入順序,但。 – Thilo

+1

@Thilo沒有LinkedHashMap –

+0

LinkedHashMap會更好,是的。但是,目前尚不清楚OP是否被允許改變數據結構。它說他的工作是添加到一個ArrayList中,如果該id不存在的話。 – Thilo

0

創建一個ProductList類,該類有一個ArrayList字段和一個整數集以跟蹤已添加的ID。當您添加一個項目時,請檢查該設置是否已經包含該項目的ID。如果沒有,請將該項目添加到ArrayList。所以這基本上很好地包裝了一個ArrayList。這是我會怎麼做:

public class ProductList{ 
... 
    private ArrayList<Product> list = new ArrayList<Product>(); 
    private Set<Integer> ids = new Set<Integer>(); 
... 
    public void addProduct(Product product){ 
     if(!ids.contains(product.getID())){ 
      list.add(product); 
      ids.add(product.getID()); 
      } 
     } 

    public Product removeProduct(Product product){ 
     if(!list.contains(product)) return null; 
     ids.remove(product.getID()); 
     return list.remove(product); 
     } 
... 
    } 

然後,您可以只使用

ProductList stock = new ProductList(); 

stock.addProduct(Product item);在你的其他類。

如果你認爲你將會使用你的列表,那麼創建實際的構造函數來集成你的數據字段也會非常有用。

從抽象的角度來看,這是一個很好的方法,但它可能不是最有效的方法。

+0

另一個ArrayList而不是Set也可以。 – rtheunissen

+0

我試過使用'if(list.contains(product){}'但它不起作用。我的產品在列表中是相同的和產品,但它總是屬於'else'語句而不是'如果任何人有任何想法,我很想知道,我不得不做一個for循環的負載,而不是看起來很潦草。 – alsobubbly

+0

@alsobubbly什麼類型的對象是'product'?如果它是一個類你可能想重寫'Object'類的'equals'方法,這允許你定義'product'事實上等於另一個'product','contains'方法調用equals '在列表中的每個產品上的方法我認爲,給出一個鏡頭,並且如果你喜歡的話可以回報 可以在這裏閱讀更多: [java中的equals方法](http://stackoverflow.com/q/15175109/ 828867) http://www.artima.com/lejava/articles/equality.html – rtheunissen

相關問題