如何实现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
相关产品推荐
相关产品推荐

