首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用FastUtil ()对FastUtil BigList进行排序

如何用FastUtil ()对FastUtil BigList进行排序
EN

Stack Overflow用户
提问于 2019-02-17 20:31:33
回答 1查看 799关注 0票数 0

如果我有数组,我可以使用Collection.sort()什么是非常有效和快速的。但是现在我必须使用BigList来保存我的对象类型的许多元素,并且我必须按值对它们进行排序,从名为JasPlayer截取为int和昵称为String的对象中进行排序。

我尝试过使用Collection.sort(),但是我不能像普通列表那样使用它。

代码语言:javascript
复制
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";
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-17 23:22:11

我很确定你正在遭受XY问题的折磨。Fastutil的BigList比普通列表更难使用,如果元素的数量不能超过Integer.MAX_VALUE,就没有理由使用它。

如果您真的需要它(假设您确实有3000万个元素,并且需要将它们作为一个列表存储在内存中),我发现对BigList排序的方式是在BigArrays类合并和快速排序中使用静态排序方法。他们以下列论点为论据:

  • 开始(包括)和结束(独占)索引排序,即0和列表的大小
  • 一个LongComparator,它是一个给定两个长索引的对象,它比较这些索引中的元素
  • 一个BigSwapper,它是一个对象,它给两个长索引交换这些索引的元素。

示例:

代码语言:javascript
复制
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());
     }
}

输出:

代码语言:javascript
复制
Biglist before: [Z, X, Y, A, C, B]
Biglist after : [A, B, C, X, Y, Z]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54737423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档