javaSE (二十)ArrayList去除集合里面重复的元素(普通类型、引用类型)

1、ArrayList去除集合里面重复的元素(普通类型、引用类型)):

主要步骤:

  1. 创建新集合
  2. 老集合获取迭代器
  3. 遍历老集合
  4. 如果新集合不包含老集合的元素,就放在新集合里 contains

这个里面有两个坑:
第一个是iterator.next()方法,我们来看一下它的底层是怎么写的
每调用一次,cursor = i + 1;光标(指针)都会加一;

第二个就是我们的ArrayList里面放自己创建的类(比如Student)时,必须重写contains里面的equals方法,因为contains里面用的是Object.equals(),比较的是两个对象的地址值,而我们要改写成比较对象的属性值(姓名、年龄一样我们就看作同一个人)(另外,ArrayList.remove()底层也是o.equals)

iterator.next()源码:

 public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;  %%%在这里,指针+1
            return (E) elementData[lastRet = i];
        }

contains源码:

  public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }

    public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))  %%%调用的是o.equals,比较的是地址值!!!
                    return i;
        }
        return -1;
    }

源代码:

1、创建新集合 
2、老集合获取迭代器 
3、遍历老集合 
4、如果不包含,就放在新集合里 判断是否包含contains底层是用o.equals写的,
5、当我们在List里面加的是自己创建的对象的时候,每个对象都有一个地址值,所以要重写equals,然它比较属性值

method1();基本类型
method2();引用类型

package cn.njupt;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class ArrayReverse {

	public static void main(String[] args) {
		// method1():去除ArrayList中重复的元素
		/*
		 * 1、创建新集合 2、老集合获取迭代器 3、遍历老集合 4、如果不包含,就放在新集合里 判断是否包含contains底层是用o.equals写的,
		 * 当我们在List里面加的是自己创建的对象的时候,每个对象都有一个地址值,所以要重写equals,然它比较属性值
		 */
		method1();

		method2();
	}

	public static void method2() {
		ArrayList arr3 = new ArrayList();
		arr3.add(new Student("吴彦祖", 23));
		arr3.add(new Student("吴彦祖", 23));
		arr3.add(new Student("吴彦祖", 23));
		arr3.add(new Student("吴彦祖", 23));
		arr3.add(new Student("陈冠希", 32));
		arr3.add(new Student("陈冠希", 32));
		arr3.add(new Student("陈冠希", 32));
		arr3.add(new Student("陈冠希", 32));
		arr3.add(new Student("林俊杰", 28));
		arr3.add(new Student("林俊杰", 28));
		arr3.add(new Student("林俊杰", 28));
		arr3.add(new Student("林俊杰", 28));

		ArrayList arr4 = new ArrayList();
		Iterator it3 = arr3.iterator();
		while (it3.hasNext()) {

			Object obj = it3.next();
			if (!arr4.contains(obj)) {
				arr4.add(obj);
			}

		}
		Iterator it4 = arr4.iterator();
		while (it4.hasNext()) {
			System.out.println(it4.next());
		}
	}

	public static void method1() {
		ArrayList arr1 = new ArrayList();
		arr1.add("a");//arr1.add("a");arr1.add("a");arr1.add("a");arr1.add("a");
		arr1.add("b");// arr1.add("b");arr1.add("b");arr1.add("b");
		arr1.add("c");
		arr1.add("c");
		arr1.add("c");
		arr1.add("c");
		arr1.add("a");

		ArrayList arr2 = new ArrayList();
		Iterator it1 = arr1.iterator();
		while (it1.hasNext()) {
			Object obj = it1.next();
			if (!arr2.contains(obj)) {
				arr2.add(obj);
			}

		}

		Iterator it2 = arr2.iterator();
		while (it2.hasNext()) {
			System.out.println(it2.next());
		}
	}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值