Java8计算地图中对象列表的平均值

2024-01-26

初始数据:

public class Stats {
    int passesNumber;
    int tacklesNumber;

    public Stats(int passesNumber, int tacklesNumber) {
        this.passesNumber = passesNumber;
        this.tacklesNumber = tacklesNumber;
    }

    public int getPassesNumber() {
        return passesNumber;
    }

    public void setPassesNumber(int passesNumber) {
        this.passesNumber = passesNumber;
    }

    public int getTacklesNumber() {
        return tacklesNumber;
    }

    public void setTacklesNumber(int tacklesNumber) {
        this.tacklesNumber = tacklesNumber;
    }
} 

Map<String, List<Stats>> statsByPosition = new HashMap<>();
statsByPosition.put("Defender", Arrays.asList(new Stats(10, 50), new Stats(15, 60), new Stats(12, 100)));
statsByPosition.put("Attacker", Arrays.asList(new Stats(80, 5), new Stats(90, 10)));

我需要按位置计算统计数据的平均值。因此结果应该是具有相同键的映射,但是值应该聚合到单个 Stats 对象(列表应减少为单个 Stats 对象)

{
  "Defender" => Stats((10 + 15 + 12) / 3, (50 + 60 + 100) / 3),
  "Attacker" => Stats((80 + 90) / 2, (5 + 10) / 2)
} 

我认为 Java8 中没有任何新内容可以真正帮助解决这个问题,至少效率不高。

如果您仔细查看所有新 API,您会发现它们中的大多数旨在提供更强大的原语来处理单个值及其序列 - 即,处理序列double, int, ? extends Object, etc.

例如,计算序列的平均值double,JDK引入了一个新类——DoubleSummaryStatistics它做了一件显而易见的事情 - 收集任意序列的摘要double价值观。 我实际上建议你自己采取类似的方法:制作你自己的StatsSummary类看起来像这样:

// assuming this is what your Stats class look like:
class Stats {
  public final double a ,b; //the two stats
  public Stats(double a, double b) {
    this.a = a; this.b = b;
  }
}

// summary will go along the lines of:
class StatsSummary implements Consumer<Stats> {
  DoubleSummaryStatistics a, b; // summary of stats collected so far
  StatsSummary() {
    a = new DoubleSummaryStatistics();
    b = new DoubleSummaryStatistics();
  }

  // this is how we collect it:
  @Override public void accept(Stats stat) {
    a.accept(stat.a); b.accept(stat.b);
  }
  public void combine(StatsSummary other) {
    a.combine(other.a); b.combine(other.b);
  }

  // now for actual methods that return stuff. I will implement only average and min
  // but rest of them are not hard
  public Stats average() {
    return new Stats(a.getAverage(), b.getAverage());
  }
  public Stats min() {
    return new Stats(a.getMin(), b.getMin());
  }
}

现在,上述实现实际上允许您在使用时表达正确的意图Stream等等:通过构建严格的 API 并使用 JDK 中可用的类作为构建块,总体上会减少错误。

但是,如果您只想在某个地方计算一次平均值并且不需要其他任何东西,则对此类进行编码有点矫枉过正,这里有一个快速而肮脏的解决方案:

Map<String, Stats> computeAverage(Map<String, List<Stats>> statsByPosition) {
  Map<String, Stats> averaged = new HashMap<>();
  statsByPosition.forEach((position, statsList) -> {
    averaged.put(position, averageStats(statsList));
  });
  return averaged;
}

Stats averageStats(Collection<Stats> stats) {
  double a, b;
  int len = stats.size();
  for(Stats stat : stats) {
    a += stat.a;
    b += stat.b;
  }
  return len == 0d? new Stats(0,0) : new Stats(a/len, b/len);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java8计算地图中对象列表的平均值 的相关文章

随机推荐

  • Objective-c:使用带有导航栏的第二个视图启动应用程序

    我正在为 iPad 创建一个应用程序 我创建了 3 个带有导航栏的视图 但我想不在第一个视图中启动我的应用程序 而是在第二个视图中启动我的应用程序 我该怎么办 您可以设置UI导航控制器 http developer apple com li
  • 编写一个 Rust 宏重复,它可能会也可能不会初始化结构体字段

    我正在尝试编写一个列出多个结构字段的宏 但有条件地仅从列表中的某些字段创建初始化程序代码 具体来说 可能看起来像这样 test fn test derive PartialEq Debug struct Foo bar usize let
  • 批量验证 yaml 文件

    我需要验证一大堆 YAML 文件 我尝试了 yaml 在线解析器 http yaml online parser appspot com http yaml online parser appspot com 效果很完美 但是将每个 YAM
  • 将 HttpContent 转换为 byte[]

    我目前正在开发 C Web API 对于特定调用 我需要使用 ajax 调用 API 发送 2 个图像 以便 API 可以将它们以 varbinary max 形式保存在数据库中 你如何提取一个Image or byte from a Ht
  • 如何打开没有菜单项的侧边栏?

    是否可以打开侧边栏而无需打开菜单并单击某个项目 我的意思是我们可以添加一个像按钮一样的菜单并在单击时打开侧边栏吗 我知道的最短的方法是将单个项目添加到菜单中 function onOpen e SpreadsheetApp getUi cr
  • 如何在 quill 编辑器中使用 v-model

    我用的是Vue 3 我以前用过这个 效果很好
  • mysql:信息架构上的访问被拒绝

    当我创建新用户或向现有用户授予权限时 出现此错误 ERROR 1045 28000 Access denied for user root localhost using password YES 对除 information schema
  • 迭代范围内的单元格时出现类型不匹配错误

    您好 我正在尝试在电子表格上运行以下 vb 代码 但在范围内出现数据类型不匹配的错误 我只是想锁定值为 0 的单元格 有些单元格的值为 NA 有什么想法吗 Sub Test Dim Cell As Range Set MyPlage Ran
  • Maven glassfish 嵌入式插件中的 JSP 热插拔

    我正在尝试设置嵌入式 glassfish maven 插件并且成功了 但是我无法使 jsp 文件热交换 这是我的配置
  • 10k 租户和多租户数据库设计 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们正在尝试为新的 Web 应用程序决定数据库设计 我们预计将有近 10 000 个租户 并且希望将他们的数据保存在单独的数据库中 如
  • Qt iOS 运行失败

    当我尝试在 iOS 模拟器上运行我的应用程序时 应用程序输出 I see Starting remote process Run ended 当我尝试在 iPhone 上运行它时 Issues I see xcodebuild failed
  • 如何在休眠中为自身实体添加@onetoone映射

    如何为自身实体添加一对一映射 就像这个例子一样 我想为 Person 本身建立父子关系 Entity Table name PERSON public class Person Id Column name personId private
  • 在 make 中“触及”目标是什么意思?

    例如 从 mingw32 make exe help 选项 t touch Touch targets instead of remaking them 它只是意味着更新文件修改时间 这样下次就不会认为这些文件是旧的
  • CSS - 在电脑上分屏但在移动设备上堆叠

    我试图将我的页面分成 4 个相等的部分 我想将左上角水平分成 2 个部分 我主要关心的是它在移动设备上的表现 我不希望它像在电脑上那样被分割 我希望它被堆叠起来 块在另一个上面 如图所示 我想过引导网格 但我做不到 到目前为止我所拥有的内容
  • 如何使用量角器+角度获取迭代器索引/键?

    通过中继器查找元素时有没有办法访问迭代器索引 键 protractor By repeater id cat in pets 在本例中 我希望访问猫的 id id 不是表中显示为值的列之一 它用于导航ng click goto pets c
  • SSL_connect 返回=1 errno=0 状态=SSLv3 读取服务器证书 B:证书验证失败

    我在用Authlogic 连接 https github com viatropos authlogic connect用于第三方登录 运行适当的迁移后 Twitter Google yahoo 登录似乎工作正常 但 facebook 登录
  • 为什么 Python 中对集合的处理不统一?

    Python 中集合和列表的处理方式不同 并且似乎没有统一的方法来处理这两者 例如 将一个项目添加到set是使用完成的add方法 并且对于list它是使用完成的append方法 我知道这背后有不同的语义 但也有共同的语义 并且通常与某些集合
  • 用于电子邮件的 JUnit 报告单页 XSLT

    我有一个 Junit 进程 每天晚上运行大量数据完整性测试 我希望它以格式良好的 HTML 电子邮件形式发送结果 问题是 JUnit 中内置的 HTML 格式化程序使用框架和外部样式表 因此它不适合电子邮件 普通格式化程序将结果埋在一堆原本
  • 未捕获的语法错误:计算时出现意外的标识符

    我有一些返回一个的代码Uncaught SyntaxError当我运行它但我不明白为什么 我尝试将其通过 JSHint 但无济于事 这是明显错误的代码 function compute expr x string var whatisx x
  • Java8计算地图中对象列表的平均值

    初始数据 public class Stats int passesNumber int tacklesNumber public Stats int passesNumber int tacklesNumber this passesNu