2012-08-10 101 views
0

集合的順序,你會如何去維護託收業務的訂單對象爪哇 - 維護對象

<BO1, BO2, BO3, BO4> 

這樣,當你刪除BO2,AMD BO4你

<BO1, BO3> 

,然後當您添加BO2

<BO1, BO2, BO3> 
+0

如何確定對象的順序?是否有可能知道BO2應該介於1,3之間,而不知道它在去除之前的位置? – Sharkos 2012-08-10 15:25:13

回答

3

你有這樣做的幾種方法,但是這取決於你想使用收集的類型。很明顯,您不想維護插入的順序,而是根據列表中元素的類型進行排序。

所以說用這樣或那樣的之前,問自己以下問題:

我的收藏可容納重複的元素?

1)如果是:那麼你可以使用一個List對象(ArrayListLinkedList等的實現)。但是你需要在每次插入後的列表進行排序:

List<MyObj> list = ... 
list.add(myObjInstance); 
Collections.sort(list); 

爲了避免排序每個你可以使用Apache的Commons Collections中的TreeList執行插入列表中。

2)如果上一個問題的答案是否定的。然後使用TreeSet,您不需要使用該實現對每個插入的集合進行排序。

請注意,您的對象元素必須實現Comparable接口才能成爲可排序

2

讓你的業務對象Comparable並使用排序的集合(如TreeSet這是一個SortedSet)。

+0

這假定BO1,BO2,BO3可以被排序,並且它們不依賴於它們被首次添加到列表中的順序。如果他們然後提供第二個列表,元素永遠不會被刪除將允許它比較適用。 – 2012-08-10 15:27:34

+0

@JonTaylor:我認爲Peter Lawrey的答案的第一行解釋了它。 – 2012-08-10 15:33:15

+0

我不這麼認爲。它與你的回答相同,表示它必須具有可比性。但是,如果列表的未來排序取決於它們被添加的原始順序而不是任何特定的可比較的排序,則比較器本身將是無用的。 – 2012-08-10 15:36:27

3

除非您使用排序順序,否則我不會看到該集合應該如何知道BO2應該放在中間。

這會做你想要什麼,如果你的業務對象實現可比

SortedSet<BusObj> bos = new TreeSet<>(); 
bos.addAll(Arrays.asList(bo1, bo2, bo3, bo4)); 
bos.removeAll(Arrays.asList(bo2, bo4)); 
bos.add(bo2); 
+1

...並且是獨一無二的。 – assylias 2012-08-10 15:23:37

+1

@assylias如果equals不被覆蓋,則可以使其唯一;) – 2012-08-10 15:25:06

+0

在TreeSet(由'TreeMap'支持)中,這不是由equals控制的,而是由compareTo(當它返回0時)控制的。 – 2012-08-10 15:31:42

0

Aswering我的問題:

我想也PriorityQueue中會是一個解決方案,如果一個人不感興趣的隨機訪問。