Как отсортировать FastUtil BigList с помощью Collection.sort () - PullRequest
0 голосов
/ 17 февраля 2019

Если у меня есть arraylist, я могу использовать Collection.sort (), что очень эффективно и быстро.Но теперь мне нужно использовать BigList для хранения большого количества элементов моего типа объекта, и мне нужно отсортировать их по значению, из объекта с именем JasPlayer убивает как int, а псевдоним как String.

Я пытался использовать Collection.sort () Какой лучший способ сделать это, но я не могу использовать его как обычный список.

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";
}

1 Ответ

0 голосов
/ 18 февраля 2019

Я почти уверен, что вы страдаете от проблемы XY .BigList Fastutil сложнее в использовании, чем обычные списки, и нет причин использовать его, если количество элементов не может превышать Integer.MAX_VALUE.

Если вам это действительно нужно (скажем, у вас действительно 3000 миллионов элементов и вам нужно сохранить их в памяти в виде списка), то, как я обнаружил сортировку BigList, использует статические методы сортировки в классе BigArrays, слияние и быстрая сортировка .Они принимают в качестве аргументов:

  • Начальный (включающий) и конечный (исключающий) индексы для сортировки, т. Е. 0 и размер списка
  • a LongComparator, который является объектом, который задандва длинных индекса сравнивают элементы с этими индексами
  • a 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]
...