2011-11-18 32 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过滤重复,有