java面试题:数组去重

面试中遇到一道笔试题,写一个数组去重的方法。

  • 方法一

我们可以创建一个空的List,遍历数组,依次将数组中的值传入List,利用List的 contains()方法,如果List已经包含当前遍历到的数组元素,则不添加进List,保证其唯一性;用List的toArray()方法把集合转换成数组。

	public static void duplicateRemovalByList(String [] arrStr) {
        List<String> list = new ArrayList<String>();
        for (int i=0; i<arrStr.length; i++) {
            if(!list.contains(arrStr[i])) {
                list.add(arrStr[i]);
            }
        }
        String[] newArrStr =  list.toArray(new String[1]);
        System.out.println(Arrays.toString(newArrStr));
    }
  • 方法二

利用Map集合键的不可重复性,遍历数组,把每个数组元素都传进Map集合,得到乱序而不重复的Map集合;再用Map的keySet().toArray()方法把集合转换成数组。

    public static void duplicateRemovalByMap(String [] arrStr) {
        Map<String, Object> map = new HashMap<String, Object>();
        for (String str : arrStr) {
            map.put(str, str);
        }
        String[] newArrStr =  map.keySet().toArray(new String[1]);
        System.out.println(Arrays.toString(newArrStr));
    }
  • 方法三

利用数组去重,先创建一个新的数组B,与原数组A等长,先不传入值(则B = { null , null , null , ... , null });立一个flag并遍历A,依次取A中每一个值与B中所有值作比较,一旦值比较出相等的,则flag设false,当A中这一个值与B中所有值比较完之后,flag如果还是true,则把A的当前值传给B,如为false则不做操作,进入下一轮循环,保证唯一性;当遍历完A后,得到一个等长、无重复的B(末尾可能有多个null值),并得到末位非null的索引值index;创建新数组C,长度为index,遍历B数组(仅取到索引为index),传入C。

	public static void duplicateRemovalByArr() {
		Integer[] arr = { 1, 1, 2, 3 };
		Integer[] tmp = new Integer[arr.length];
		int m = 0;
		for (int i = 0; i < arr.length; i++) {
			// 判断tmp数组是否存在
			boolean flag = true;
			for (int n = 0; n < tmp.length; n++) {
				if (tmp[n] == arr[i]) {
					// 如果有相等的,设置为flase
					flag = false;
				}
			}
			if (flag) {
				tmp[m++] = arr[i];
			}
		}
		// list去重
		Integer[] newArr = new Integer[m];
		// 检测数组有多少为null,并且赋值为新的数组
		for (int k = 0; k < m; k++) {
			newArr[k] = tmp[k];
		}
		tmp = newArr;
		System.out.println(Arrays.toString(tmp));
	}
  • 方法四

实例化一个Set集合,遍历数组并存入集合,如果元素已存在则不会重复存入,最后返回Set集合的数组形式。

    public static Object[] duplicateRemovalBySet(Object[] arr){  
        Set set = new HashSet();   
        for (int i = 0; i < arr.length; i++) {  
            set.add(arr[i]);  
        }    
        return set.toArray();  
    }
  • 方法五

通过链表去重,遍历数组,传入LinkedHashSet,得到无重复的元素集合;创建迭代器,迭代集合。

    public static void duplicateRemovalByLink(Object[] arr){           
        LinkedHashSet<Object> link = new LinkedHashSet<Object>();  
        for (int i = 0; i < arr.length; i++) {  
        	link.add(arr[i]);  
        }  
        Iterator<Object> iterator = link.iterator();
        System.out.println(link);
		/*
		 * while (iterator.hasNext()) { System.out.print(iterator.next()+" "); }
		 */  
    } 

                                                                                                                                                                                                                             

                                                                                                                                                                                                                                                                                                                                                                                                                              鸢飞戾天,经纶世务

                                                                                                                                                                                                       2019年7月30日

转载于:https://my.oschina.net/u/4132908/blog/3081012

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值