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

来源:互联网 发布:linux 跨机器拷贝文件 编辑:程序博客网 时间:2024/06/05 02:32

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]]


原创粉丝点击