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

Android中统计List<Pair<Long, Pair<Integer, Integer>>>的Long字段出现次数

问题分析与解决

原代码存在两个关键问题,导致统计结果错误:

  1. 初始值处理错误:oldGid默认初始化为0,第一次循环时与第一个元素的first值(示例中为2)不相等,会错误地将counter=1添加到someList并重置计数器,破坏后续统计逻辑。
  2. 遗漏最后一组计数:循环结束后,最后一组重复元素的计数未被添加到someList中。

另外,原代码中使用oldGid == obj.first进行比较,虽然oldGid是基本类型long,obj.first是包装类Long会自动拆箱,但对于超出-128~127范围的Long值,==比较会失效,建议改用equals方法进行对象比较。


修正方案一:基于原变量的循环修正

直接调整循环逻辑,正确处理初始值和最后一组的计数:

someList.clear(); // 先清空列表避免重复添加
if (!xyOffset.isEmpty()) {
    oldGid = xyOffset.get(0).first;
    counter = 1;
    // 从第二个元素开始遍历
    for (int i = 1; i < xyOffset.size(); i++) {
        Pair<Long, Pair<Integer, Integer>> obj = xyOffset.get(i);
        if (obj.first.equals(oldGid)) {
            counter++;
        } else {
            someList.add(counter);
            counter = 1;
            oldGid = obj.first;
        }
    }
    // 添加最后一组的计数
    someList.add(counter);
}

针对你的输入示例,这段代码会生成[3, 1, 1, 2]的正确结果。


修正方案二:使用Java 8+流API简化实现

利用流的分组收集功能,代码更简洁且可读性更高,同时保证分组顺序与原排序后的列表一致(通过LinkedHashMap维护顺序):

someList = xyOffset.stream()
        // 按first字段分组,用LinkedHashMap保证顺序,统计每组数量
        .collect(Collectors.groupingBy(
                pair -> pair.first,
                LinkedHashMap::new,
                Collectors.counting()
        ))
        .values() // 获取所有分组的计数
        .stream()
        .map(Long::intValue) // 转换为Integer类型
        .collect(Collectors.toList());

这种方式无需手动维护计数器和临时变量,代码更健壮。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:05:18