Android中统计List<Pair<Long, Pair<Integer, Integer>>>的Long字段出现次数
问题分析与解决
原代码存在两个关键问题,导致统计结果错误:
- 初始值处理错误:
oldGid默认初始化为0,第一次循环时与第一个元素的first值(示例中为2)不相等,会错误地将counter=1添加到someList并重置计数器,破坏后续统计逻辑。 - 遗漏最后一组计数:循环结束后,最后一组重复元素的计数未被添加到
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
相关产品推荐
相关产品推荐

