我面临着一个无法解决的问题:
我从电话中读取了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());