java - 对具有百万或更多元素的 ArrayList 执行计算的最佳实践
问题描述
我正在做一个面试测试,并没有真正的方法来解决这个问题。我希望你们能帮助我找出解决这类问题的最佳方法。
该问题由最大容量的 ArrayList 组成,即 Integer.MAX_VALUE。
ArrayList<User> arr = new ArrayList<User>(Integer.MAX_VALUE);
这是假设的,他们还提到
arr.ensureCapacity(Integer.MAX_VALUE); // shows no issues
User
据说该对象包含 Int 值 a 和 b。
问题是,为每个“用户”计算 c 值的最佳方法是什么,其中 c 是 a、b 值相乘的结果。
我的答案是将列表分解为更小的列表,然后并行遍历所有更小的列表。当我进行计算时,我将结果添加到值为 c 的结果列表中。像这样的东西,
List<User> firstNElementsList = list.stream().limit(n).collect(Collectors.toList());
我不知道 N 的合适大小是多少。我只是说 N 可以是任意的,例如 1000 或 10000 或 100000。阶梯将是 10 个要处理的列表。
我没有通过测试,所以这个答案还不够。有更好的想法吗?
解决方案
使用并行流处理,并保持轻量级,使用 anIntStream
来收集结果int[]
:
int[] cs = arr.parallelStream().mapToInt(u -> u.getA() * u.getB()).toArray();
注意,使用并行处理时,结果的顺序可能与输入的原始顺序不一致,但这并没有说明为要求,只是“收集所有a * b
”;它并没有说你必须知道User
每个值c
来自哪个。
a
尽管没有说明,或者andb
的任意值u.getA() * u.getB()
可能导致算术溢出,所以更安全的方法是使用long
结果值:
long[] cs = arr.parallelStream().mapToLong(u -> u.getA() * u.getB()).toArray();
作为一名面试官,我希望应聘者在这一点上要求澄清,如果答案是“是”,则提供第二个选项,如果有保证a * b
永远不会溢出,则证明权重稍轻的第一个选项是合理的int
。
推荐阅读
- node.js - 更改 pkg 库中的 .exe 文件图标
- sql - 从过滤器行django中仅选择非空字段
- postgresql - Docker:运行脚本:错误:无法锁定数据库:权限被拒绝
- flutter - 如何从 Firebase 存储中检索元数据?
- cmake - 何时使用 pkg_check_modules 作为后备查找
? - c++ - ld-linux-x86-64.so.2执行文件时如何避免更改有效UID
- reactjs - 如何使用 Typescript 在 React Native Web 中加载 .web 扩展文件
- sql - 带有错误数据的 SQL SELECT
- node.js - 将 Wordpress 集成到 node.js 应用程序中
- ios - Swift UI 中的导航栏自定义 DropShadow