ArrayList去除重复元素

去除一个ArrayList的重复元素有两种方法:(ArrayList与Vector的存储结构是Object[],LinkedList是双向列表)

  第一种是不需要借助临时list,用equals方法比较ArrayList中数据,两次遍历原来list;

  第二种是借助一个临时ArrayList,向临时List添加数据,调用arrayList.contains(obj)判断是否存在

  了解ArrayList的contains原理:调用obj的equals方法进行判断在ArrayList中的位置是否大于零,进而判断是否存在。

复制代码
    public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }

    /**
     * Returns the index of the first occurrence of the specified element
     * in this list, or -1 if this list does not contain the element.
     * More formally, returns the lowest index <tt>i</tt> such that
     * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>,
     * or -1 if there is no such index.
     */
    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]))
                    return i;
        }
        return -1;
    }
复制代码

 

1.  两种方式对ArrayList中重复字符串的处理:

复制代码
@Test
    // 第一种去重复方法
    public void Test1() {
        List<String> list = new ArrayList<String>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("4");
        list.add("3");
        list.add("2");
        list.add("1");
        System.out.println("去重复元素之前:");
        for (String s : list) {
            System.out.println(s);
        }
        // 遍历ArrayList
        for (int i = 0; i < list.size() - 1; i++) {
            for (int j = i + 1; j < list.size(); j++) {
                if (list.get(i).equals(list.get(j))) {
                    list.remove(j);
                }
            }
        }
        System.out.println(list.size());
        System.out.println("去重复元素之后:");
        for (String s : list) {
            System.out.println(s);
        }
    }

    @Test
    // 第二种去重复方法
    public void Test2() {
        List<String> list = new ArrayList<String>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("4");
        list.add("3");
        list.add("2");
        list.add("1");
        List<String> temp = new ArrayList<String>();
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            String str = iterator.next();
            if (!temp.contains(str)) {
                temp.add(str);
            }
        }
        for (String s : temp) {
            System.out.println(s);
        }
    }
复制代码

 

 

2.  两种方式对ArrayList中重复对象的处理:

Person.java   重写equals方法

复制代码
package cn.xm.exam.test.javaTest;

import static org.hamcrest.CoreMatchers.instanceOf;

public class Person {

    private String name;
    private String id;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Person(String name, String id) {
        super();
        this.name = name;
        this.id = id;
    }

    // 重写一个Bean的hashCode方法
    /*
     * @Override public int hashCode() { // TODO Auto-generated method stub
     * return this.name.hashCode()+this.id.hashCode(); }
     */
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof Person)) {
            throw new ClassCastException();// 类型错误
        }
        Person pp = (Person) obj;
        return this.getId().equals(pp.getId()) && this.getName().equals(pp.getName());
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", id=" + id + "]";
    }

}
复制代码

 

去重算法:

复制代码
@Test
    // 第一种去重复方法去除Object重复的
    public void Test3() {
        List<Person> list = new ArrayList<Person>();
        list.add(new Person("张三", "1"));
        list.add(new Person("张三", "2"));
        list.add(new Person("张三", "3"));
        list.add(new Person("张三", "4"));
        list.add(new Person("李四", "1"));
        list.add(new Person("李四", "2"));
        list.add(new Person("张三", "1"));
        list.add(new Person("李四", "1"));
        // 遍历ArrayList
        for (int i = 0; i < list.size() - 1; i++) {
            for (int j = i + 1; j < list.size(); j++) {
                if (list.get(i).equals(list.get(j))) {
                    list.remove(j);
                }
            }
        }
        for (Person p : list) {
            System.out.println(p);
        }
    }

    @Test
    // 第二种去重复方法去除Object重复的
    public void Test4() {
        List<Person> list = new ArrayList<Person>();
        list.add(new Person("张三", "1"));
        list.add(new Person("张三", "2"));
        list.add(new Person("张三", "3"));
        list.add(new Person("张三", "4"));
        list.add(new Person("李四", "1"));
        list.add(new Person("李四", "2"));
        list.add(new Person("张三", "1"));
        list.add(new Person("李四", "1"));
        List<Person> temp = new ArrayList<Person>();
        Iterator<Person> iterator = list.iterator();
        while (iterator.hasNext()) {
            Person person = iterator.next();
            if (!temp.contains(person)) {
                temp.add(person);
            }
        }
        for (Person p : temp) {
            System.out.println(p);
        }
    }
复制代码

 

结果:

Person [name=张三, id=1]
Person [name=张三, id=2]
Person [name=张三, id=3]
Person [name=张三, id=4]
Person [name=李四, id=1]
Person [name=李四, id=2]

 

posted @   QiaoZhi  阅读(22163)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示