java - 排序集合的最快方法

标签 java hibernate sorting

我正在替换工作中使用的应用程序,将 Hibernate 与现有数据库结合使用。我无法修改数据库,因为它正在与其他进程一起使用。当 Hibernate 从数据库中拉取主对象时,子对象被放入一个无序集合中。我以前从未真正处理过集合或排序集合。

我需要显示每个集合的最后一个(按时间顺序) child 。没有为子对象存储日期,但由于数据库中的 id 字段是 AUTO_INCREMENT,我可以按 id 代替日期对它们进行排序。

对正在使用的现有系统的提示之一是它真的非常慢。我想证明新应用程序确实提高了速度。

给定一个具有 0 到 n 个“家庭地址”的 Person 对象(变量名称“off”),我正在使用:

    Set addressSet = off.getAddresses();
    List<Address> addressList = new ArrayList<>();
    Iterator i = addressSet.iterator();
    while(i.hasNext()){
        addressList.add((Address) i.next());
    }
    Collections.sort(addressList, new AddressComparator());

    Address a = null;
    if(addressList.size()>0){
        a = addressList.get(addressList.size()-1);
    }else{
        a = new Address(); //creates new Address object with empty strings 
                           //for fields
    }

我的简单比较器是:

public int compare(Address t, Address t1) {
    return t.getId().compareTo(t1.getId());
}

我的问题:通过 Java 或 Hibernate,是否有更快的方法来对集合进行排序?

最佳答案

在我看来,您根本不需要排序。使用

Collections.max()

Collections.min()

使用您提供的自定义比较器来查找您想要的地址。与 O(nlog(n)) 排序时间相比,这在最坏的情况下有 O(n) 运行时间,因为您不排序并且只迭代您的集合一次。积极的一面是您不需要将 Set 转换为 List,因为 max 和 min 方法适用于任何 Collection 实例。

另一个优势(至少对我而言)是 Collections 实用程序是 java 运行时的一部分,因此您不需要添加任何第三方库。

关于java - 排序集合的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23787525/

相关文章:

java - 无法从 src\test 文件夹中找到 "Run File"-> 找不到或无法加载主类

Java 2d 游戏-游戏中非常奇怪的 "bug"

java - 使用 HibernateTemplate 时无法获取列名称

javascript - 如何使用 Array.sort() 正确排序数字?

java - 按字符串排序

Java:如果我们必须自己实现抽象方法,实现多个接口(interface)如何实现多重继承?

java - HibernatePersistenceProvider : Unsupported major. 次要版本 52.0 intellij

java - Hibernate 映射和唯一索引或主键违规

c - `qsort()` 真的是 QuickSort 吗?

c++ - 对定义为 vector<double> 的矩阵进行排序