我面临着一个无法解决的问题:

我从电话中读取了ArrayList

ArrayList<Game> gameResult = writeRead.getArrayList(this);


我将每个gamer中的对象game放入新的ArrayList中:

ArrayList<Gamer> gamerList = new ArrayList<>();
for (int i = 0; i < gameResult.size(); i++) {
    gamerList.add(gameResult.get(i).getWinnerGamer());
}


现在,我想做的是:


Gamer中添加ArrayList(如果尚不存在)
如果存在,请将++添加到名为LeaderPoints的参数中
按点排序


这是关于使用自定义ArrayList的排行榜活动,但我还没有这样做。

我所有的代码:

private void setGamerList() {

    ArrayList<Game> gameResult = writeRead.getArrayList(this);
    ArrayList<Gamer> gamerList = new ArrayList<>();
    ArrayList<Gamer> gamerNoDuplicate = new ArrayList<>();

    if (gameResult != null) {

        for (int i = 0; i < gameResult.size(); i++) {
            gamerList.add(gameResult.get(i).getWinnerGamer());
        }
    }

    Log.i(TAG, "--------------------------------");

    Collections.sort(mGamerList, (o1, o2) ->
        o2.getLeaderboardScore().compareTo(o1.getLeaderboardScore()));
}

最佳答案

writeRead.getArrayList(this).stream()
            .map(Game::getWinnerGamer)
            .collect(Collectors.groupingBy(Gamer::getName, Collectors.summingInt(Gamer::getLeaderboardScore)))
            .entrySet()
            .stream()
            .sorted(Comparator.comparing(Map.Entry<String, Integer>::getValue).reversed())
            .map(entry -> new Gamer(entry.getKey(), entry.getValue()))
            .collect(Collectors.toList());


脚步:


提取优胜者
按名称分组优胜者并汇总分数。结果,您将获得地图
获取此地图的entrySet
在此entySet上打开流
按DESC方向分数排序
将条目映射到Gamer(为每个条目创建新的Gamer实例)
收集到清单


我的回答是基于您具有以下结构的假设:

class Game {
    private Gamer winnerGamer;
    // getter & setter
}

class Gamer {
    private String name;
    private Integer leaderboardScore;
    // getters & setters && AllArgsContructor
}


顺便说一句:如果您在类Gamer中覆盖了equals和哈希码,则可以避免Gamer重新玩:

writeRead.getArrayList(this).stream()
            .map(Game::getWinnerGamer)
            .collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(Gamer::getLeaderboardScore)))
            .entrySet()
            .stream()
            .sorted(Comparator.comparing(Map.Entry<Gamer, Integer>::getValue).reversed())
            .map(Map.Entry::getKey)
            .collect(Collectors.toList());

09-25 21:35