【问题标题】:Passing List to Set Constructor, does filtering happen in order?将 List 传递给 Set 构造函数,过滤是否按顺序进行?
【发布时间】:2011-12-31 20:26:00
【问题描述】:

我正在从 JPA 查询中检索一个按有效日期排序的列表。除了日期列之外,可能有重复的条目,我将首先为它们排序最近的日期(desc)。我想要的只是所有具有最新有效日期的条目; Set 中不允许具有较旧有效日期的欺骗。

如果我通过将此 List 传递给构造函数来创建 HashSet,那么新 Set 是否仅包含 List 中的第一个条目,仅包含具有“最新”有效日期的条目?

也就是说,Set 在从 List 创建时是否按 List 顺序初始化?

谢谢!

【问题讨论】:

    标签: java list casting set


    【解决方案1】:

    如果您从具有重复项的集合创建HashSet,则只有每个重复项中的第一个将被添加到哈希集中。

    adds the items in the list in order,并且add方法不会覆盖重复。

    虽然未指定此行为,但它极不可能改变。

    【讨论】:

    • 也感谢您对 GrepCode 的介绍。
    【解决方案2】:

    “重复条目”是指您的查询返回了不同的行/对象实例,并且您以不包含此有效日期字段的方式定义了 equals/hashCode?换句话说,如果你说 list.get(i) 和 list.get(j) 除了日期之外是重复的,你的意思是 list.get(i) != list.get(j) 和 list.get( i).equals(list.get(j)).

    如果这就是你的意思,那么我相信第一个进入系列的人会获胜。

    【讨论】:

    • 谢谢,是的,这正是我所拥有的。 Equals & hashCode 排除有效日期。
    【解决方案3】:

    SLaks 已经在 HashSet 方面击败了我,但如果您可以选择使用 LinkedHashSet 代替,那可能会更好。

    我对@9​​87654321@ 的阅读表明第一个副本保证会被保留:

    请注意,如果将元素重新插入集合中,则插入顺序不会受到影响。 (如果在调用 s.contains(e) 将在调用之前立即返回 true 时调用 s.add(e),则元素 e 将重新插入集合 s。)

    【讨论】:

      【解决方案4】:

      在java Collection Framework方面,

      如果您只想在插入期间保留订单,HashSet 将通过删除任何重复项来保留第一次出现的位置。但是,如果您还想在迭代期间保持顺序,请使用 LinkedHashSet

      在 JPA 的情况下

      您可能会发现select distinct 查询对过滤重复项很有用,从而避免了多余的收集处理

      select distinct a from ....
      

      How do you create a Distinct query in HQL

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-07
        • 2011-09-24
        • 2012-01-15
        相关资源
        最近更新 更多