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

如何实现IntegerSet的并集方法?仅传一个集合时如何访问两个集合

实现IntegerSet的union并集方法

首先明确核心点:在union实例方法中,当前调用该方法的集合对象可以通过this关键字访问,传入的otherSet参数则代表另一个需要合并的集合。下面分两种常见的作业实现场景给出代码:

场景1:用布尔数组实现IntegerSet(学校作业常用)

这类实现中,数组索引代表整数,数组值为true表示该整数存在于集合中。

完整IntegerSet类实现

public class IntegerSet {
    // 核心存储:索引对应整数,true表示该整数在集合中
    private boolean[] set;

    // 构造方法:从int数组初始化集合
    public IntegerSet(int[] array) {
        if (array.length == 0) {
            set = new boolean[0];
            return;
        }
        // 找到数组最大值,确定布尔数组长度
        int maxNum = Integer.MIN_VALUE;
        for (int num : array) {
            if (num > maxNum) {
                maxNum = num;
            }
        }
        set = new boolean[maxNum + 1];
        // 标记存在的整数
        for (int num : array) {
            set[num] = true;
        }
    }

    // 重写toString,方便测试打印
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("{");
        boolean firstElement = true;
        for (int i = 0; i < set.length; i++) {
            if (set[i]) {
                if (!firstElement) {
                    sb.append(", ");
                }
                sb.append(i);
                firstElement = false;
            }
        }
        sb.append("}");
        return sb.toString();
    }

    // 实现union并集方法
    public IntegerSet union(IntegerSet otherSet) {
        // 确定新集合的布尔数组长度:取两个集合的最大索引+1
        int unionLength = Math.max(this.set.length, otherSet.set.length);
        boolean[] unionData = new boolean[unionLength];

        // 1. 复制当前集合的元素
        for (int i = 0; i < this.set.length; i++) {
            unionData[i] = this.set[i];
        }

        // 2. 合并另一个集合的元素:只要元素存在就设为true
        for (int i = 0; i < otherSet.set.length; i++) {
            if (otherSet.set[i]) {
                unionData[i] = true;
            }
        }

        // 3. 将布尔数组转换为int数组,适配构造方法
        int[] resultArray = new int[countTrueElements(unionData)];
        int index = 0;
        for (int i = 0; i < unionLength; i++) {
            if (unionData[i]) {
                resultArray[index++] = i;
            }
        }

        return new IntegerSet(resultArray);
    }

    // 辅助方法:统计布尔数组中true的数量
    private int countTrueElements(boolean[] arr) {
        int count = 0;
        for (boolean exists : arr) {
            if (exists) {
                count++;
            }
        }
        return count;
    }
}

测试代码验证

public class IntegerSetTest {
    public static void main(String[] args) {
        int[] array1 = {1, 3, 5, 7};
        int[] array2 = {2, 3, 6, 7};
        IntegerSet set1 = new IntegerSet(array1);
        IntegerSet set2 = new IntegerSet(array2);
        System.out.println("set1: " + set1); // 输出 {1, 3, 5, 7}
        System.out.println("set2: " + set2); // 输出 {2, 3, 6, 7}

        IntegerSet unionSet = set1.union(set2);
        System.out.println("并集: " + unionSet); // 输出 {1, 2, 3, 5, 6, 7}
    }
}

场景2:用Java集合框架实现IntegerSet(更简洁)

如果作业允许使用java.util.Set,实现会更简单:

import java.util.HashSet;
import java.util.Set;

public class IntegerSet {
    private Set<Integer> elements;

    public IntegerSet(int[] array) {
        elements = new HashSet<>();
        for (int num : array) {
            elements.add(num);
        }
    }

    @Override
    public String toString() {
        return elements.toString();
    }

    public IntegerSet union(IntegerSet otherSet) {
        // 复制当前集合的元素
        Set<Integer> unionElements = new HashSet<>(this.elements);
        // 合并另一个集合的所有元素
        unionElements.addAll(otherSet.elements);
        // 转换为int数组返回新的IntegerSet
        int[] resultArray = unionElements.stream().mapToInt(Integer::intValue).toArray();
        return new IntegerSet(resultArray);
    }
}

核心逻辑总结

  • 访问当前集合:通过this.成员变量(比如this.set或this.elements)获取当前调用对象的集合数据
  • 访问传入集合:直接使用参数otherSet.成员变量获取另一个集合的数据
  • 并集规则:只要元素在任意一个集合中存在,就保留在结果集合中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:05:38