如果我有arraylist,我可以使用Collection.sort(),这是非常有效和快速的。但是现在我必须使用BigList来保存我的对象类型的许多元素,并且必须按值对它们进行排序,而从名为JasPlayer的对象中杀死的则是int,而昵称是String。
我尝试使用Collection.sort()是实现此目的的最佳方法,但我不能像普通List那样使用它。
private BigList<JasPlayer> playerRankingPlaces;
public BigList<JasPlayer> getRanking() {
return this.playerRankingPlaces;
}
public void addRankingElement(JasPlayer element) {
this.playerRankingPlaces.add(element);
}
public void setRanking(BigList<JasPlayer> playerRanking) {
this.playerRankingPlaces = playerRanking;
}
public void sortRankingList() {
for(JasPlayer player : JasPlayerUtils.getPlayers()) {
addRankingElement(player);
long startTime = System.nanoTime();
//THERE's Problem, i can't use biglist like normal list :\
Collections.sort(playerRankingPlaces, Comparator.comparing(Ranking :: getKills).thenComparing(Ranking :: getName));
long endTime = System.nanoTime() - startTime;
MessageUtils.sendDebug("Sorting " + playerRankingPlaces.size() + "took " + endTime / 1e9 + " seconds");
}
}
private static int getKills(UUID uuid) {
if(JasPlayerUtils.findByUUID(uuid).isPresent()) {
return JasPlayerUtils.findByUUID(uuid).get().getKills();
}
return 0;
}
private static String getName(UUID uuid) {
if(JasPlayerUtils.findByUUID(uuid).isPresent()) {
return JasPlayerUtils.findByUUID(uuid).get().getPlayer().getName();
}
return "Brak";
}
答案 0 :(得分:3)
我很确定您正在遭受XY Problem的折磨。 Fastutil的BigList比普通列表更难使用,并且如果元素数不能超过Integer.MAX_VALUE,则没有理由使用它。
如果您确实需要它(例如您确实有30亿个元素,并且需要将它们作为列表存储在内存中),我发现对BigList进行排序的方法是使用BigArrays类的静态排序方法,{{3 }}。他们认为:
示例:
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]