首页 > 解决方案 > 对具有百万或更多元素的 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 个要处理的列表。

我没有通过测试,所以这个答案还不够。有更好的想法吗?

标签: javaarraysarraylist

解决方案


使用并行流处理,并保持轻量级,使用 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


推荐阅读