java怎么合并两个数组去重

上周,我在学习Java集合操作时,发现了一个很实用的技巧,就是使用Set接口来合并两个数组并自动去重。
这让我想到了一个例子,2 02 3 年4 月,我那个朋友在处理一些数据时,需要合并两个包含重复元素的数组。

首先,我们创建一个HashSet集合,因为HashSet不保证元素的顺序,但能确保集合中不存在重复元素。
然后,我们遍历两个数组,将所有元素逐个添加到Set中,重复的元素就会被自动过滤掉。
最后,我们使用toArray()方法将Set转换为数组,注意类型转换,因为Set存储的是Integer对象,所以我们需要将结果转换为int[]。

下面是示例代码:
java import java.util.Arrays; import java.util.HashSet; import java.util.Set;
public class MergeArrays { public static void main(String[] args) { int[] arr1 = {1 , 2 , 3 , 4 , 5 }; int[] arr2 = {3 , 4 , 5 , 6 , 7 };
// 创建HashSet Set set = new HashSet();
// 将两个数组的元素添加到Set for (int num : arr1 ) { set.add(num); } for (int num : arr2 ) { set.add(num); }
// 将Set转换为int[]数组 int[] mergedArray = new int[set.size()]; int index = 0; for (int num : set) { mergedArray[index++] = num; }
// 输出结果(顺序可能不一致,因HashSet无序) System.out.println("合并去重后的数组: " + Arrays.toString(mergedArray)); } }
此外,我还想补充一点,如果你使用的是Java 8 及以上版本,可以通过Stream API来简化这个过程。
这样可以更简洁地实现合并和去重。

java import java.util.Arrays; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.IntStream;
public class MergeArraysStream { public static void main(String[] args) { int[] arr1 = {1 , 2 , 3 , 4 , 5 }; int[] arr2 = {3 , 4 , 5 , 6 , 7 };
// 合并两个数组并去重 Set set = IntStream.concat(Arrays.stream(arr1 ), Arrays.stream(arr2 )).boxed().collect(Collectors.toSet());
// 转换为int[] int[] mergedArray = set.stream().mapToInt(Integer::intValue).toArray();
System.out.println("合并去重后的数组: " + Arrays.toString(mergedArray)); } }
在使用这个方法时,要注意顺序问题。
如果需要保持顺序,可以选择使用LinkedHashSet(按插入顺序)或TreeSet(按自然顺序)。
对于大规模数据,HashSet的性能优于TreeSet,除非你需要排序。
通过上述方法,可以高效地合并两个数组并去重。
你看着办,这个方法在处理数据时很实用。

java数组中的数字怎么去重

说实话,用Set去重这事儿我当年做项目时踩过坑,但确实好用。
你给的例子写得很清晰,我补充点个人经验。

先说TreeSet。
有一回我处理用户ID列表,要求必须去重且有序。
用TreeSet的时候,我发现插入重复元素时根本不会报错,但最后转数组的时候,那重复的元素就真的没了。
当时我还琢磨半天,原来是Set的特性和预期不太一致。
这种场景下TreeSet就特别合适,但你要是就想要个无脑去重的,HashSet可能更省心。

HashSet我倒是用得更多。
比如处理日志里的URL访问记录,完全没必要管访问顺序,而且日志数据量有时候吓人。
我直接new个HashSet,遍历日志文件一行行加进去,最后转数组。
这种场景下,我试过用ConcurrentHashMap的keySet去重,性能比HashSet还稳,但代码复杂度也上来了。

Java 8 的流式操作确实方便,特别是distinct().sorted().toArray()这连写下来,代码看着就干练。
不过有次我处理一个特别大的数组,用流去重的时候发现内存飙升,后来改用for循环+HashSet才搞定。
所以说,流操作看着高级,但真遇到性能瓶颈,还是得回过头来用传统方式。

关键在于知道Set不能直接存基本类型。
我见过有人用Byte、Short这种包装类去重int数组,结果精度问题导致数据错乱,惨不忍睹。
所以int转Integer得加小心,转回来用mapToInt()也必须用流,否则类型转换警告满天飞。

其实去重这事儿,除了Set,我后来还用过LinkedHashMap的keySet,那玩意儿保持插入顺序,去重效率也高。
但Set的API更统一,学习成本更低,所以还是它用得最多。