gpt4 book ai didi

java - 计算列表列表中对象属性的总和(带流)

转载 作者:行者123 更新时间:2023-11-30 06:15:26 25 4
gpt4 key购买 nike

我使用的是 Java 8,我想使用 List.stream() 功能解决我的问题。

这是我的问题:

这是 Score 类(Player 类无关紧要):

public class Score {

private Player player;
private int score;

public Player getPlayer() {
return player;
}

public void setPlayer(Player player) {
this.player = player;
}

public int getScore() {
return score;
}

public void setScore(int score) {
this.score = score;
}
}

在我的程序开始时,我有一个玩家列表:

List<Player> players; // Populated elsewhere

然后我的程序执行它必须执行的操作,并且我得到一个这种类型的变量:

List<List<Score>> scores; // Populated elsewhere

现在我想为每个玩家打印这样的格式化输出:

Player.getName() + " : " + averagedScore;

其中 averagedScore 是一个 Playerscore.getScore() 值的总和除以 Score 的出现次数这个玩家在我的 scores 变量中。


现在,我到目前为止所做的事情:

for (Players player : players) {
scores.stream().filter(x -> x.stream().anyMatch(y -> y.getPlayer().equals(player)));
}

但我不知道如何计算子列表中包含的并由 element.getPlayer() 过滤的 element.getScore() 的总和

最佳答案

在“平面映射”您的列表列表后,您可以结合使用 groupingByaveragingInt 收集器:

Map<Player, Double> scoreByPlayer = scores.stream()
.flatMap(List::stream)
.collect(groupingBy(Score::getPlayer, averagingInt(Score::getScore)));

scoreByPlayer.forEach((p, s) -> System.out.println(p + " : " + s));

注意:需要以下静态导入:

import static java.util.stream.Collectors.averagingInt;
import static java.util.stream.Collectors.groupingBy;


供引用,完整示例:

public static void main(String[] args) {
Player adam = new Player("Adam");
Player pat = new Player("Pat");
Player susie = new Player("Susie");
List<List<Score>> scores = new ArrayList<> ();
scores.add(Arrays.asList(s(adam, 1), s(pat, 2), s(susie, 3)));
scores.add(Arrays.asList(s(adam, 2), s(pat, 4), s(susie, 6)));
scores.add(Arrays.asList(s(adam, 3), s(pat, 6), s(susie, 9)));

Map<Player, Double> scoreByPlayer = scores.stream()
.flatMap(List::stream)
.collect(groupingBy(Score::getPlayer, averagingInt(Score::getScore)));

scoreByPlayer.forEach((p, s) -> System.out.println(p + " : " + s));
}

private static Score s(Player p, int score) { return new Score(p, score); }

public static class Score {
private final Player player;
private final int score;
public Score(Player player, int score) {
this.player = player;
this.score = score;
}

public Player getPlayer() { return player; }
public int getScore() { return score; }
}

public static class Player {
private final String name;
public Player(String name) { this.name = name; }
@Override public String toString() { return name; }
}

关于java - 计算列表列表中对象属性的总和(带流),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28852853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com