Java集合list删除重复元素问题

1.第一种删除重复元素的方法

为了删除list集合中重复的元素

先看看下面这种方法:(以ArrayList为例)

import java.util.*;

public class Main
{
    public static void main(String args[])
    {
        List list = new ArrayList();
        list.add("1");
        list.add("4");
        list.add("2");
        list.add("1");
        list.add("4");
        list.add("4");
        list.add("2");
        list.add("1");

        for(int x = 0;x<list.size()-1;x++)
        {
            Object obj = list.get(x);
            for(int y = x+1;y<list.size();y++)
            {
                if(obj.equals(list.get(y)))
                {
                    list.remove(y);
                }
            }
        }
        System.out.println(list);
    }
}
//打印结果:[1, 4, 2, 4]
可以见到打印结果不如人意,导致错误的原因是:每次调用 remove()后,ArrayList的长度size()就会减一,因此当删除了元素时重新获取的size()值就会减一。导致有些重复的元素不能被检测到。


正确做法是,没次调用remove()删除元素后,都使y-1:

import java.util.*;

public class Main
{
    public static void main(String args[])
    {
        List list = new ArrayList();
        list.add("1");
        list.add("4");
        list.add("2");
        list.add("1");
        list.add("4");
        list.add("4");
        list.add("2");
        list.add("1");

        for(int x = 0;x<list.size()-1;x++)
        {
            Object obj = list.get(x);
            for(int y = x+1;y<list.size();y++)
            {
                if(obj.equals(list.get(y)))
                {
                    list.remove(y);
                    y = y-1;   //每次删除一次元素都使y - 1
                }
            }
        }
        System.out.println(list);
    }
}
//打印结果:[1, 4, 2,]


2.另一种比较方便的删除 list 重复元素的方法:

1.new一个临时 list 容器

2.从待检测的 list 容器中取出一个元素,若该元素不在临时容器中,则添加到临时容器。

3.清空待检测容器

4.把临时容器的元素赋给待检测容器

import java.util.*;

public class Main
{
    public static void main(String args[])
    {
        List list = new ArrayList();
        list.add("1");
        list.add("4");
        list.add("2");
        list.add("1");
        list.add("4");
        list.add("4");
        list.add("2");
        list.add("1");

        List temp = new ArrayList();
        for(Iterator it = list.iterator();it.hasNext();)
        {
            Object temp_obj = it.next();
            if(!temp.contains(temp_obj))
            {
                temp.add(temp_obj);
            }
        }
        list.clear();
        list.addAll(temp);
        System.out.println(list);
    }
}
//打印结果:[1, 4, 2]


3.如何删除重复自定义元素

引用上面的方法即可,不过要额外重写 equals()函数 和 toString() 函数。前者用于指定自定义元素比较标准,后者用于指定自定义元素的打印方式:

import java.util.*;

class Person
{
    public String name;
    public int age;
    Person(String name,int age)
    {
        this.name = name;
        this.age = age;
    }

    public boolean equals(Object obj)//重写equals
    {
        Person p = (Person)obj;
        return this.name.equals(p.name) && this.age == p.age;
    }

    public String toString()//重写toString
    {
        return ("["+this.name+"',"+this.age+"]");
    }
}

public class Main
{
    public static void main(String args[])
    {
        List list = new ArrayList();
        List temp = new ArrayList();
        list.add(new Person("xiaoming",20));
        list.add(new Person("xiaohong",21));
        list.add(new Person("xiaohong",21));
        list.add(new Person("xiaoming",20));
        list.add(new Person("xiaoming",20));

        for(Iterator it = list.iterator();it.hasNext();)
        {
            Object obj = it.next();
            if(!temp.contains(obj))
            {
                temp.add(obj);
            }
        }
        list.clear();
        list.addAll(temp);
        System.out.println(list);
    }
}
//打印结果:[[xiaoming',20], [xiaohong',21]]


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值