美文网首页
造火箭之数组怎么去重?

造火箭之数组怎么去重?

作者: bearPotMan | 来源:发表于2019-04-08 21:02 被阅读0次

    假如有下面这样一个数组,怎么给它去重?

    Integer[] arrs = new Integer[]{2,5,3,3,2,4,5};
    

    稍微有点经验的人可能会说什么算法呀,集合类呀,吧啦吧啦说一堆......
    你配钥匙吗?
    我不配!
    其实数组去重的方式有很多,下面就来分别演示一下几种去重方式:

    1. 最基础的实现方式
    public static Integer[] primitive(Integer[] arrays){
        Integer[] temp = new Integer[arrays.length];
        for (int i = 0; i < arrays.length; i++) {
            boolean flag = true;
            for (int j = i + 1; j < arrays.length; j++) {
                if (arrays[i].equals(arrays[j])) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                temp[i] = arrays[i];
            }
        }
        return temp;
    }
    

    像上面这样是可以实现,但是不严谨,因为临时数组的长度不好确定,而且返回的临时数组部分元素会是 null,所以可以考虑使用List来代替临时数组,改变之后就是下面这样:

    public static List primitive(Integer[] arrays){
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < arrays.length; i++) {
            boolean flag = true;
            for (int j = i + 1; j < arrays.length; j++) {
                if (arrays[i].equals(arrays[j])) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                list.add(arrays[i]);
            }
        }
        return list;
    }
    
    1. 有没有其他稍微简单一点的实现方式呢?既然上面的方式已经使用了集合,那有没有可以使用集合来实现的呢?
    • 纯List实现:List中的元素允许重复,所以要判断一下是否已有该元素
    public static List deduplicationByList(Integer[] arrays){
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < arrays.length; i++) {
            if (!list.contains(arrays[i])){
                list.add(arrays[i]);
            }
        }
        return list;
    }
    
    • 使用 Map 实现:Map 的 key 不允许重复,所以可以使用 key 来去重
    public static Set deduplicationByMap(Integer[] arrays) {
        Map map = new HashMap();
        for (int i = 0; i < arrays.length; i++) {
            map.put(arrays[i], new Object());
        }
        return map.keySet();
    }
    
    • 使用 Set 实现:Set 不允许有重复元素
    public static Set<Integer> deduplicationBySet(Integer[] arrays){
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < arrays.length; i++) {
            set.add(arrays[i]);
        }
        return set;
    }
    

    其实 Set 和 Map的原理是差不多的,因为 HashSet 的底层实现就是基于 HashMap 的,综合上述几个实现来讲,可能最受欢迎的就是最后一个了吧!
    但是面试的时候可不单单是这么简单哟,各个集合类的底层实现最好比较熟悉,这三个集合类里最复杂的应该就是 HashMap 的底层实现了吧,又是拉链式散列算法又是红黑树的,所以还是好好努力吧!

    相关文章

      网友评论

          本文标题:造火箭之数组怎么去重?

          本文链接:https://www.haomeiwen.com/subject/ivqpiqtx.html