算法日记-找出数组中的交集元素


个人觉得这个数组应该分为两类,一种是数字,一种是字符串。

由于数组中的元素种类不同,使用的方法有略微的差别

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:如果大家有更好的方式去求数组中的交集,跪求大佬在留言中写下方法,感激不尽!!