我正在替换工作中使用的应用程序,将 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/