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

求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("------------------------");
        }
    }
}

关键注意点:

  1. 每次处理新集合要重置sum:如果sum定义在循环外,会累加所有集合的元素,所以必须把sum放在外层循环内部,每次处理新集合时重新初始化。
  2. 避免除以0:如果某个HashSet是空的,计算平均值会触发异常,所以一定要先判断集合是否为空。
  3. 整数除法的精度问题:直接用sum / set.size()会做整数除法(比如总和9924、元素数5,结果会是1984而非1984.8),所以要把sum转为double再做除法,或者用Stream的average()方法(返回double类型的OptionalDouble)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:04:27