算法日记-找出数组中的交集元素
个人觉得这个数组应该分为两类,一种是数字,一种是字符串。
由于数组中的元素种类不同,使用的方法有略微的差别
1.针对数字和字符串都可以的方式
/**
* 求两个字符串数组的交集,通过遍历比较,找出相同的,生成一个新的数组并返回
* @param s1
* @param s2
* @return
*/
public static String[] mixed(String[] s1, String[] s2){
List<String> list = Lists.newArrayList();
for (int i = 0; i < s1.length; i++) {
for (int j = 0; j < s2.length; j++) {
if(s1[i].equals(s2[j])){
list.add(s1[i]);
break;
}
}
}
String[] common = new String[list.size()];
return list.toArray(common);
}
通过对两个数组进行遍历,取出其中相同的部分,然后放入list中,最后进行返回,比较容易理解!
2.针对数字,上述的代码可以进行优化
/**
* 两个数字数组求交集
* 首先先对数组进行排序,设定两个指针,并遍历数组
* 判断两个指针位置的数字的大小,如果第一个比第二个大,第二的指针往后移一位
* 把两个数组中的相同的放在一个数组里并返回
* @param s1
* @param s2
* @return
*/
public static int[] mixed2(int[] s1, int[] s2){
Arrays.sort(s1);
Arrays.sort(s2);
List<Integer> list = Lists.newArrayList();
int i = 0;
int j = 0;
while(i < s1.length && j < s2.length){
if(s2[j] > s1[i]){
i++;
}else if(s2[j] < s1[i]){
j++;
}else {
list.add(s1[i]);
i++;
j++;
}
}
Integer[] num = list.toArray(new Integer[]{});
return Arrays.stream(num).mapToInt(Integer::valueOf).toArray();
}
首先先对两个数组进行排序,然后定义两个指针,如果第一个指针的数字比第二指针的数字大,则将第二指针向后移,反之则移动第一个指针,如果两个指针所指向的数字相同,那么把这个指针指向的数字放入list中,最后进行返回。
3.通过Java8的新特性Stream进行取交集
/**
* 找出两个数组之间的交集
* 通过Java8中的Stream进行计算
* @param s1
* @param s2
* @return
*/
public static String[] mixedByStream(String[] s1, String[] s2){
List<String> list1 = Arrays.asList(s1);
List<String> list2 = Arrays.asList(s2);
List<String> collect = list1.stream().filter(list2::contains).collect(Collectors.toList());
return collect.toArray(new String[]{});
}
这个方法乍一看有点侮辱智商,但是写起来极为简便,可以应用在数字和字符串上。
4.使用Set的数据结构进行求交集。
/***
* 传递两个数组,利用Set集合的天然去重,遍历两个数组
* @param s1
* @param s2
* @return
*/
public static String[] mixedBySet(String[] s1, String[] s2){
Set<String> set = Sets.newHashSet();
set.addAll(Arrays.asList(s1));
set.addAll(Arrays.asList(s2));
return set.toArray(new String[]{});
}
使用Set集合的天然去重,取出交集。
Tips:如果大家有更好的方式去求数组中的交集,跪求大佬在留言中写下方法,感激不尽!!