之前用到set和map集合很少,这里恰好写题的时候遇见了就总结一下用法(Map下次遇见再):
题目:
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
说明:
输出结果中的每个元素一定是唯一的。
我们可以不考虑输出结果的顺序。
//上面说过输出的每个元素都是唯一的,那么就是说即使交集重复的也只会输出一个
//换句话说就可以去重判断是否存在即可
//去重的话可以用到set集合,它内部的 元素都是无序并且不重复,添加的元素如果是重复的则会返回false
//因为不允许有重复 元素,所以内部也提供了判断集合里是否存在该元素的方法contains()
public static int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> s1=new HashSet<Integer>();
HashSet<Integer> s2=new HashSet<Integer>();
for(int num:nums1) {
s1.add(num);
}
for(int num:nums2) {
s2.add(num);
}
HashSet<Integer> temp=new HashSet<Integer>();
if(s1.size()<s2.size()) {
for(int num:s1) {
if(s2.contains(num)) {
temp.add(num);
}
}
}else {
for(int num:s2) {
if(s1.contains(num)) {
temp.add(num);
}
}
}
int []arr=new int[temp.size()];
int i=0;
//这里注意set集合里的遍历是没有顺序的,不能保证顺序,并且set集合不支持索引访问
//如果需要索引的话,需要返回set集合的迭代器
//遍历里面的元素简单直接的就是通过增强for循环直接获取
for(int num:temp) {
arr[i++]=num;
}
return arr;
}
总结用法:上面题解注释里也写了一些,Set集合里面的元素是没有重复项的,在之后遇见删除重复项的时候可以使用它,牺牲空间换取时间, 因此它的查找是很高效的,它不能保证储存的元素有序,也不支持索引访问,因此遍历这个集合的时候可以采用增强for循环的方式,或者返回该集合的迭代器(下面会有方法)
HashSet的常用方法(大多数返回值都是布尔值,因为不允许有重复值,所以操作之前会判断,有重复值即返回false):
add(E):如果有重复元素则返回false
clear():清空
containg(Object):判断是否包含指定元素
iterator():返回此集合的迭代器
size()
remove():有就删除