集合的順序,你會如何去維護託收業務的訂單對象爪哇 - 維護對象
<BO1, BO2, BO3, BO4>
這樣,當你刪除BO2,AMD BO4你
<BO1, BO3>
,然後當您添加BO2
<BO1, BO2, BO3>
集合的順序,你會如何去維護託收業務的訂單對象爪哇 - 維護對象
<BO1, BO2, BO3, BO4>
這樣,當你刪除BO2,AMD BO4你
<BO1, BO3>
,然後當您添加BO2
<BO1, BO2, BO3>
你有這樣做的幾種方法,但是這取決於你想使用收集的類型。很明顯,您不想維護插入的順序,而是根據列表中元素的類型進行排序。
所以說用這樣或那樣的之前,問自己以下問題:
我的收藏可容納重複的元素?
1)如果是:那麼你可以使用一個List
對象(ArrayList
,LinkedList
等的實現)。但是你需要在每次插入後的列表進行排序:
List<MyObj> list = ...
list.add(myObjInstance);
Collections.sort(list);
爲了避免排序每個你可以使用Apache的Commons Collections中的TreeList
執行插入列表中。
2)如果上一個問題的答案是否定的。然後使用TreeSet
,您不需要使用該實現對每個插入的集合進行排序。
請注意,您的對象元素必須實現Comparable
接口才能成爲可排序。
讓你的業務對象Comparable
並使用排序的集合(如TreeSet
這是一個SortedSet
)。
這假定BO1,BO2,BO3可以被排序,並且它們不依賴於它們被首次添加到列表中的順序。如果他們然後提供第二個列表,元素永遠不會被刪除將允許它比較適用。 – 2012-08-10 15:27:34
@JonTaylor:我認爲Peter Lawrey的答案的第一行解釋了它。 – 2012-08-10 15:33:15
我不這麼認爲。它與你的回答相同,表示它必須具有可比性。但是,如果列表的未來排序取決於它們被添加的原始順序而不是任何特定的可比較的排序,則比較器本身將是無用的。 – 2012-08-10 15:36:27
除非您使用排序順序,否則我不會看到該集合應該如何知道BO2應該放在中間。
這會做你想要什麼,如果你的業務對象實現可比
SortedSet<BusObj> bos = new TreeSet<>();
bos.addAll(Arrays.asList(bo1, bo2, bo3, bo4));
bos.removeAll(Arrays.asList(bo2, bo4));
bos.add(bo2);
...並且是獨一無二的。 – assylias 2012-08-10 15:23:37
@assylias如果equals不被覆蓋,則可以使其唯一;) – 2012-08-10 15:25:06
在TreeSet(由'TreeMap'支持)中,這不是由equals控制的,而是由compareTo(當它返回0時)控制的。 – 2012-08-10 15:31:42
有2個選項:使用List
並做整理自己通過在適當位置插入或使用排序的集合。
我認爲你想要的排序後的集合是SortedSet
http://docs.oracle.com/javase/6/docs/api/java/util/SortedSet.html。
SortedSet需要條目來實現接口Comparable
。
還有另外一個問題,你應該看看:Sorted collection in Java
Aswering我的問題:
我想也PriorityQueue中會是一個解決方案,如果一個人不感興趣的隨機訪問。
如何確定對象的順序?是否有可能知道BO2應該介於1,3之間,而不知道它在去除之前的位置? – Sharkos 2012-08-10 15:25:13