我需要使用自定义比较器来排序集,而不必在内存中复制它。

天真的实现将是:

Set<MyClass> newSet = new TreeSet<>(myComparator);
newSet.addAll(oldSet);


但这意味着即使在有限的时间内,我在内存中也会有两套:oldSet(无序)和newSet(有序)。由于它们会很大,因此我想避免这种情况。

我想执行以下操作:

oldSet = new TreeSet<>(oldSet, myComparator);


这实际上是不可能的,因为没有TreeSet的构造函数具有这种结构。

这可以解决吗?

Iterator<MyClass> it = oldSet.iterator();
Set<MyClass> newSet = new TreeSet<>(myComparator);
while(it.hasNext())
{
    newSet.add(it.next());
    it.remove();
}


有什么更好的建议吗?

谢谢

最佳答案

为此,使用TreeSet并不是最节省内存的,甚至也不是最快的方法。

您应该使用ArrayList并对其进行排序:

List<MyClass> sorted = new ArrayList<>(oldSet.size());
oldSet = null;
Collections.sort(sorted, myComparator);


ArrayList中使用的单个数组的开销应该不是问题,无论如何这是您可以遇到的最小问题。

单次批量排序操作比为TreeSet中的每个单个项目以及在这种情况下所需的所有分配查找合适的位置要快。

09-05 11:41