2011-03-10 37 views
1

有沒有任何Java容器有兩種方法,添加,刪除,只需要元素(而不是索引)?從哪個java包含我可以更容易地刪除元素,不知道元素的索引?

我想要做這樣的事情:

MagicContainer<Foo> mc = MagicContainer<Foo>(); 

mc.add(new Foo()); 
mc.add(someFoo1=new Foo()); 
mc.add(new Foo()); 
mc.add(someFoo2=new Foo()); 

mc.remove(someFoo1); 
mc.remove(someFoo2); 
+1

就像回答說的那樣,它是java.util.Set。如果你想使用Set,你必須在Foo類中實現equals和hashCode。 – 2011-03-10 13:55:51

+1

@Victor:如果** Object的默認行爲(即每個對象只等於它自己),你**可以使用'HashSet'&co而不重寫'hashCode()'和'equals )是可以接受的! – 2011-03-10 13:59:26

+1

@Joachim:是的,當然是 – 2011-03-10 14:07:06

回答

1

每個Java Collection有一個add()和一個remove()方法可以做你想做的。

因爲Collection是一個接口,所以您需要選擇其中一個實現(通常是SetList實現)。 ArrayList是一個非常普遍的選擇。

A HashSet是另一種可能的候選者。

Colllection<Foo> mc = new ArrayList<Foo>(); 

mc.add(new Foo()); 
mc.add(someFoo1=new Foo()); 
mc.add(new Foo()); 
mc.add(someFoo2=new Foo()); 

mc.remove(someFoo1); 
mc.remove(someFoo2); 

你想要的具體實現取決於你想要的其他屬性。

如果您希望通過索引保留已定義的訂單和訪問對象,則需要執行List實施。 「默認」ListArrayList。如果你經常刪除/添加元素除了結束,那麼LinkedList將提供更好的性能(但大多數時候你不會注意到它們之間的差異)。

如果你想避免重複的對象,那麼你將需要一個Set實現。 「默認」SetHashSet,但TreeSet也偶爾使用,提供具有已定義順序的額外好處(但要求您提供Comparator或確保所有元素均爲Comparable)。

+0

據我所知,我需要知道索引數字從ArrayList中刪除一些東西,所以只有實現Set接口的集合似乎沒問題。 – noisy 2011-03-10 17:16:33

+0

@noisy remove可以接受一個對象引用,並可在所有列表實現中使用。不需要索引。 – 2011-03-10 18:25:52

+0

@noisy:'remove()'實際上在'List'上被重載。有一個將索引作爲「int」,然後有一個(鏈接在上面)將對象移除(該對象由'Collection'接口繼承。 – 2011-03-10 19:18:02

0

任何一組的實現應該工作。

+0

雖然不是完全錯誤,但這不是整個商店。 ['remove(Object)'方法在'Collection'中定義](http://download.oracle.com/javase/6/docs/api/java/util/Collection.html#remove%28java.lang.Object %29)。所以你的'集合'不必是一個'集合'這是可能的! – 2011-03-10 19:19:34

相關問題