You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组多分组统计:单次遍历多条件VS多次遍历单条件,哪种效率更高?

嘿,针对你要统计1000个int数组里各类子群体(偶数、奇数、大于500的元素等)数量的需求,我给你拆解下两种常用实现方案的细节,帮你根据场景选最合适的~

方案一:传统循环+多条件判断

这个方案的核心思路是一次遍历搞定所有统计:只走一遍数组,对每个元素同时检查所有需要统计的条件,符合哪个就给对应计数器加1。

示例代码如下:

int[] someArray = new int[1000];
// 假设数组已经初始化填充数据

int evenCount = 0;
int oddCount = 0;
int over500Count = 0;

for (int i = 0; i < someArray.length; i++) {
    int num = someArray[i];
    if (num % 2 == 0) {
        evenCount++;
    } else {
        oddCount++;
    }
    if (num > 500) {
        over500Count++;
    }
    // 可以继续添加更多条件判断
}

优缺点分析

  • 👍 优点:性能拉满,只遍历数组一次,内存开销极低,适合大规模数组的统计场景
  • 👎 缺点:如果需要统计的条件越来越多,代码会变得臃肿,可读性和可维护性下降,新增条件得在循环里加if,容易出错
方案二:惰性流处理(Lazy Evaluation)

这个方案利用Java Stream的惰性特性,通过Supplier包装流对象,每次需要统计某类群体时,才触发一次流的遍历(因为Stream只有遇到终端操作时才会执行)。这样每个统计逻辑都是独立的,代码更清爽。

示例代码如下:

int[] someArray = new int[1000];
// 假设数组已经初始化填充数据

// 用Supplier包装流,每次get()都会生成一个新的流实例
Supplier<IntStream> streamSupplier = () -> Arrays.stream(someArray);

// 分别统计各类群体,每次调用get()都会遍历一次数组
long evenCount = streamSupplier.get().filter(n -> n % 2 == 0).count();
long oddCount = streamSupplier.get().filter(n -> n % 2 != 0).count();
long over500Count = streamSupplier.get().filter(n -> n > 500).count();

优缺点分析

  • 👍 优点:代码模块化、可读性强,新增统计条件只需要加一行streamSupplier.get().filter(xxx).count(),维护成本低
  • 👎 缺点:每个统计都会遍历一次数组,对于超大规模数组(比如百万级以上),性能会比方案一差;不过你这里是1000个元素,完全不用担心性能问题
选择建议
  • 如果你的统计条件很少,或者追求极致性能,选方案一
  • 如果统计条件经常变动,看重代码的整洁性和可维护性,选方案二(1000个元素的规模下,多次遍历的性能损耗几乎可以忽略)

内容的提问来源于stack exchange,提问作者tdct

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:53:51