1 回答

TA贡献1804条经验 获得超8个赞
我很确定您正遭受XY 问题的困扰。Fastutil 的 BigList 比普通列表更难使用,如果元素数量不能超过 Integer.MAX_VALUE,则没有理由使用它。
如果你真的需要它(假设你真的有 30 亿个元素并且需要将它们作为列表存储在内存中),我发现对 BigList 进行排序的方式是使用 BigArrays 类中的静态排序方法mergesort 和 quicksort。他们将其作为论据:
要排序的开始(包括)和结束(不包括)索引,即 0 和列表的大小
一个 LongComparator ,它是一个给定两个长索引的对象,比较这些索引处的元素
BigSwapper,它是一个给定两个长索引的对象,交换这些索引处的元素。
例子:
import it.unimi.dsi.fastutil.BigArrays;
import it.unimi.dsi.fastutil.BigList;
import it.unimi.dsi.fastutil.BigSwapper;
import it.unimi.dsi.fastutil.longs.LongComparator;
import it.unimi.dsi.fastutil.objects.ObjectBigArrayBigList;
public class App
{
public static void main( String[] args )
{
BigList<String> bigList = new ObjectBigArrayBigList<String>();
bigList.add("Z");
bigList.add("X");
bigList.add("Y");
bigList.add("A");
bigList.add("C");
bigList.add("B");
System.out.println("Biglist before: " + bigList.toString());
LongComparator cmp = (i,j) -> bigList.get(i).compareTo(bigList.get(j));
BigSwapper swapper = (i,j) -> {
String tmp = bigList.get(i);
bigList.set(i, bigList.get(j));
bigList.set(j, tmp);
};
BigArrays.mergeSort(0, bigList.size64(), cmp, swapper);
System.out.println("Biglist after : " + bigList.toString());
}
}
输出:
Biglist before: [Z, X, Y, A, C, B]
Biglist after : [A, B, C, X, Y, Z]
添加回答
举报