求ArrayList<HashSet<E>>中每个HashSet的元素平均值的实现方法
解决ArrayList<HashSet>的元素求和与平均值计算问题
首先得指出你代码里的两个关键问题:
- 内层循环的变量写错了!你把
j的循环自增写成了i++,这会导致死循环或者索引越界,应该是j++。 - HashSet不支持按索引访问元素,它没有
get(int index)方法——因为HashSet是无序集合,底层基于哈希表实现,所以不能用array.get(i).get(j)来获取元素。
接下来给你两种可行的实现方式,针对ArrayList<HashSet<Integer>>(你的元素是整数,泛型指定为Integer更合适):
方式一:使用增强for循环(最直观)
这种方式不需要关心索引,直接遍历每个集合里的元素,代码可读性拉满:
import java.util.ArrayList; import java.util.HashSet; public class HashSetSumAvg { public static void main(String[] args) { // 初始化你的ArrayList<HashSet<Integer>> ArrayList<HashSet<Integer>> array = new ArrayList<>(); HashSet<Integer> set1 = new HashSet<>(); set1.add(1895); set1.add(1959); set1.add(2023); set1.add(2087); set1.add(1960); array.add(set1); HashSet<Integer> set2 = new HashSet<>(); set2.add(2277); set2.add(2213); set2.add(2278); set2.add(2214); array.add(set2); // 遍历每个HashSet计算总和和平均值 for (HashSet<Integer> set : array) { int sum = 0; double avg = 0.0; // 用double避免整数除法的精度丢失 for (int num : set) { sum += num; } // 计算平均值,先判断集合非空避免除以0 if (!set.isEmpty()) { avg = (double) sum / set.size(); } // 输出结果 System.out.println("当前集合总和:" + sum); System.out.println("当前集合平均值:" + avg); System.out.println("------------------------"); } } }
方式二:使用Java 8+ Stream API(更简洁)
如果你用的是Java 8及以上版本,Stream API能让代码更简洁,一行搞定求和和平均值:
import java.util.ArrayList; import java.util.HashSet; import java.util.OptionalDouble; public class HashSetSumAvgStream { public static void main(String[] args) { // 同样初始化ArrayList<HashSet<Integer>> ArrayList<HashSet<Integer>> array = new ArrayList<>(); HashSet<Integer> set1 = new HashSet<>(); set1.add(1895); set1.add(1959); set1.add(2023); set1.add(2087); set1.add(1960); array.add(set1); HashSet<Integer> set2 = new HashSet<>(); set2.add(2277); set2.add(2213); set2.add(2278); set2.add(2214); array.add(set2); // 用Stream处理每个集合 for (HashSet<Integer> set : array) { int sum = set.stream().mapToInt(Integer::intValue).sum(); OptionalDouble avg = set.stream().mapToInt(Integer::intValue).average(); System.out.println("当前集合总和:" + sum); avg.ifPresent(a -> System.out.println("当前集合平均值:" + a)); System.out.println("------------------------"); } } }
关键注意点:
- 每次处理新集合要重置sum:如果sum定义在循环外,会累加所有集合的元素,所以必须把sum放在外层循环内部,每次处理新集合时重新初始化。
- 避免除以0:如果某个HashSet是空的,计算平均值会触发异常,所以一定要先判断集合是否为空。
- 整数除法的精度问题:直接用
sum / set.size()会做整数除法(比如总和9924、元素数5,结果会是1984而非1984.8),所以要把sum转为double再做除法,或者用Stream的average()方法(返回double类型的OptionalDouble)。
内容的提问来源于stack exchange,提问作者BaraDos
相关产品推荐
相关产品推荐

