2011-11-18 36 views
3

我從JPDA查詢中檢索列表,由effectiveDate命令。除日期列外,可能會有重複的項目,我將首先爲他們排列最近的日期(desc)。所有我想要的都是最新的effectiveDate條目;套件中不允許使用較舊的生效日期。傳遞列表設置構造函數,過濾是否按順序發生?

如果我通過將這個List傳入構造函數來創建一個HashSet,新的Set是否僅包含List中的第一個條目,只有具有「newest」effectiveDates的那些?

換句話說,當從List創建它們時,它們是按List順序初始化的嗎?

謝謝!

回答

4

如果您從具有重複項的集合創建HashSet,則只有每個副本的第一個將被添加到哈希集。

adds the items in the list in order,並且add方法不會覆蓋重複項。

雖然未指定此行爲,但不太可能改變。

+0

感謝GrepCode的介紹。 – Brian

0

SLaks已經擊敗我HashSet,但如果您可以選擇使用LinkedHashSet來代替,那可能會更好。

我的javadoc for LinkedHashSet讀數表明,第一副本可以保證被保留:

需要注意的是,如果一個元素重新插入到集插入順序不受影響。 (元素e是重新插入到集合S如果s.add(e)在s.contains(E)將調用之前立即返回true被調用。)

1

通過「重複項」,你意味着查詢返回了不同的行/對象實例,並且您已經以不包含此effectiveDate字段的方式定義了equals/hashCode?換句話說,如果你說list.get(i)和list.get(j)是重複的,除了日期,你的意思是list.get(i)!= list.get(j)和list.get ⅰ).equals(list.get(J))。

如果這就是你的意思,那麼我相信第一個插入到設置的勝利。

+0

謝謝,是的,這正是我所擁有的。等於&hashCode排除effectiveDate。 – Brian

0

在Java集合框架而言,

如果你想只插入HashSet會做,通過移除任何重複保持第一的發生存在期間保持秩序。但是,如果你想在迭代過程中保持秩序,以及使用LinkedHashSet

在JPA

的情況下

你會發現select distinct查詢有用,避免冗餘收集處理

select distinct a from .... 

看到How do you create a Distinct query in HQL過濾重複,有