黑马程序员技术交流社区

标题: 大家有什么好办法删除掉List中的重复数据 [打印本页]

作者: xp8812    时间: 2014-6-17 15:10
标题: 大家有什么好办法删除掉List中的重复数据
大家有什么好办法删除掉List中的重复数据,剩余数据顺序不能变?

作者: 2528870651    时间: 2014-6-17 15:53
本帖最后由 2528870651 于 2014-6-17 15:55 编辑

假如你要存入list集合的是一个Person对象,那么在Person类里面重写equals函数,如:
  1. public boolean equals(Object obj){
  2.                 if(!(obj instanceof Person))
  3.                         return false;
  4.                 Person p = (Person)obj;
  5.                 return this.name.equals(p.name) && this.age == p.age;
  6.         }
复制代码

然后你可以自己根据上面的函数再写个函数,再来删除

这是我上午写的程序,我也在学这里,
  1. package it.heima.com.collection;

  2. import java.util.ArrayList;
  3. import java.util.Iterator;

  4. /*
  5. 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。
  6. 比如:存人对象。同姓名同年龄,视为同一个人。为重复元素。

  7. 思路:
  8. 1,对人描述,将数据封装进人对象。
  9. 2,定义容器,将人存入。
  10. 3,取出。

  11. List集合判断元素是否相同,依据是元素的equals方法。
  12. */
  13. public class ArrayListTest {
  14.         public static void main(String[] args){
  15.                 ArrayList<Person> al = new ArrayList<Person>();
  16.                 al.add(new Person());
  17.                 al.add(new Person("zhangsan01",20));
  18.                 al.add(new Person("zhangsan02",21));
  19.                 al.add(new Person("zhangsan03",22));
  20.                 al.add(new Person("zhangsan04",23));
  21.                 al.add(new Person("zhangsan05",24));
  22.                 al.add(new Person("zhangsan01",20));

  23.                 al = singleElement(al);
  24.                 Iterator<Person> it = al.iterator();
  25.                 while(it.hasNext()){
  26.                         Person p = (Person)it.next();
  27.                         sop(p.getName()+"::"+p.getAge());
  28.                 }

  29.                
  30.         }
  31.         public static ArrayList<Person> singleElement(ArrayList<Person> al){
  32.                 //定义一个临时容器。
  33.                 ArrayList<Person> newAl = new ArrayList<Person>();

  34.                 Iterator<Person> it = al.iterator();

  35.                 while(it.hasNext()){
  36.                         Person p = it.next();

  37.                         if(!newAl.contains(p))
  38.                                 newAl.add(p);
  39.                 }

  40.                 return newAl;
  41.         }


  42.        
  43.         public static void sop(Object obj){
  44.                 System.out.println(obj);
  45.         }
  46. }
复制代码
  1. package it.heima.com.collection;

  2. public class Person {
  3.         private String name;
  4.         private int age;
  5.        
  6.         Person(){
  7.                
  8.         }
  9.         Person(String name, int age){
  10.                 this();
  11.                 this.name = name;
  12.                 this.age = age;
  13.         }
  14.        
  15.         public String getName() {
  16.                 return name;
  17.         }
  18.         public void setName(String name) {
  19.                 this.name = name;
  20.         }
  21.         public int getAge() {
  22.                 return age;
  23.         }
  24.         public void setAge(int age) {
  25.                 this.age = age;
  26.         }
  27.        
  28.         public boolean equals(Object obj){
  29.                 if(!(obj instanceof Person))
  30.                         return false;
  31.                 Person p = (Person)obj;
  32.                 return this.name.equals(p.name) && this.age == p.age;
  33.         }
  34.        
  35. }
复制代码





作者: Alan_Kwan    时间: 2014-6-17 16:08
把list的元素存入另一个List中,存入时判断是否已经contains
作者: qq474249147    时间: 2014-6-17 16:18
扔进set里去
作者: GoodBoy123    时间: 2014-6-17 16:55
如果是自定义元素的话就要复写equals如果不是自定义的话就不用。调用contains 时就会自动调用equals
作者: Aron    时间: 2014-6-17 19:29
你是要保留重复的第一个数据呢 还是后面的某一个 还是重复的都不要了啊
你想要数据中没有重复数据最好的办法就是用set集合来存放数据啊  他直接就把重复数据给筛选掉了
何必用list存了后在删除重复数据 太麻烦了
作者: 张益达    时间: 2014-6-17 21:42
删除ArrayList中重复元素,保持顺序
  1. public static void removeDuplicateWithOrder(List list) {
  2.    Set set = new HashSet();
  3.    List newList = new ArrayList();
  4.    for (Iterator iter = list.iterator(); iter.hasNext();) {
  5.           Object element = iter.next();
  6.           if (set.add(element))
  7.              newList.add(element);
  8.        }
  9.       list.clear();
  10.       list.addAll(newList);
  11.      System.out.println( " remove duplicate " + list);
  12. }
复制代码

如果用HashSet的话,如果是对象,则要将对象实现equals和hashCode方法
跪求技术分
作者: 帅哥哥    时间: 2014-6-18 10:04
放到LinkedHashSet里面,再拿出来
作者: xp8812    时间: 2014-6-18 13:27
qq474249147 发表于 2014-6-17 16:18
扔进set里去

扔到Set里顺序就变了
作者: xp8812    时间: 2014-6-18 13:28
Aron 发表于 2014-6-17 19:29
你是要保留重复的第一个数据呢 还是后面的某一个 还是重复的都不要了啊
你想要数据中没有重复数据最好的办 ...

Set以后没有顺序了
作者: qq474249147    时间: 2014-6-18 20:54
xp8812 发表于 2014-6-18 13:28
Set以后没有顺序了

LinkedHashSet




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2