【问题标题】:Sort a set in Java在 Java 中对集合进行排序
【发布时间】:2019-04-24 20:23:00
【问题描述】:

使用的框架:Spring

使用的 ORM:休眠

我有两门课

class BatchExceptionDetails{
...
private Set<BatchExceptionComments> batchExceptionComments;
}

class BatchExceptionComments implements Comparable<BatchExceptionComments>{
...
@Override
    public int compareTo(BatchExceptionComments o) {
        // TODO Auto-generated method stub

        return this.getAddedOn().compareTo(o.getAddedOn());
    }
}

它们使用一对多映射进行映射。

BatchExceptionDetails 中有一组 BatchExceptionComments。

我想根据日期对集合进行排序。 BatchExcpetionComment 具有 java.util.Date 类型的属性,即 addedOn。我希望最新的评论成为 set 的第一个元素。

我收到的集合没有排序。请您指导我哪里出错了。

提前致谢

【问题讨论】:

  • 您使用的是SortedSet吗?还是其他类型的Set
  • Collections.sort(batchExceptionComments);
  • @Lorelorelore 这仅适用于列表,不适用于集合。
  • 集合未排序。请改用列表。
  • 您不能只使用Set,因为Set 是一个接口。你在使用Set 的什么实现?

标签: java spring hibernate sorting collections


【解决方案1】:

Set 是一个接口,因此无法确定它是否可排序。您必须使用正确的实现,例如TreeSet。如果你想 强调它是一个排序集,你应该使用SortedSet接口。 TreeSet 实现 SortedSet

或者,您可以使用List,然后您可以使用Collections.sort 对其进行排序。

【讨论】:

  • 我可以使用其他集合代替 Set 吗?我假设如果我们使用 Spring,那么我们必须使用 Set for Containment。
  • 问题在于 Hibernate 需要将集合指定为接口类型。在实现类方面,它使用自己的来支持诸如延迟加载之类的东西。将类型指定为 SortedSet 而不是 Set 应该可以。
  • 无需初始化。 Hibernate 将使用自己的 SortedSet 实现自动对其进行初始化。
  • @RobbyCornelissen,我使用了 SortedSet,但在调用属性 [combeans.BatchExceptionDetails.batchExceptionComments (expected type = java.util.SortedSet)] 的 setter 时出现异常 IllegalArgumentException;
  • @RobbyCornelissen,我的设置方法是 public void setBatchExceptionComments(SortedSet batchExceptionComments) { this.batchExceptionComments = batchExceptionComments; }
【解决方案2】:

经过一番折腾,我找到了解决办法。

我刚刚声明了集合

private Set<BatchExceptionComments> batchExceptionComments;

我没有使用 Comparable,而是使用 Order By 来安排集合。

 <set name="batchExceptionComments" table="BATCH_EXCEPTION_COMMENTS" 
                inverse="true" fetch="select" lazy="false" order-by="commentId">
            <key>
                <column name="EXCEPTION_ID" not-null="true" />
            </key>
            <one-to-many class="com.beans.BatchExceptionComments" />
        </set>

我相信按 ID 订购会更好。

附:我使用的是 hbm.xml 而不是注释

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多