黑马程序员技术交流社区

标题: 为什么我写的代码去除不了list集合中的重复对象??? [打印本页]

作者: H马凯    时间: 2015-3-18 23:17
标题: 为什么我写的代码去除不了list集合中的重复对象???
  1. /*需求:去除对象中的重复元素*/

  2. import java.util.*;
  3. class Person
  4. {
  5.         private String name;
  6.         private int age;
  7.         public Person(String name,int age){
  8.                 this.name = name;
  9.                 this.age = age;
  10.         }
  11.         //使用list集合时,想要去除对象中的重复元素,必须复写equals(Object obj)
  12.         public boolean equals(Object obj){
  13.                 System.out.println("++++++++++");
  14.                 if(!(obj instanceof Person))
  15.                         throw new RuntimeException();
  16.                 Person p = (Person) obj;
  17.                 return true;
  18.         }
  19.         public String getName(){
  20.                 return name;
  21.         }
  22.         public int getAge(){
  23.                 return age;
  24.         }
  25. }
  26. class  DemoTest3
  27. {
  28.         public static void main(String[] args)
  29.         {
  30.                 ArrayList list = new ArrayList();
  31.                 list.add(new Person("li01",12));
  32.                 list.add(new Person("li01",12));
  33.                 list.add(new Person("li01",12));
  34.                 list.add(new Person("li01",12));
  35.                 list.add(new Person("li01",12));
  36.                 for(Iterator it=list.iterator();it.hasNext();){
  37.                         Person p =(Person)it.next();
  38.                         System.out.println(p.getName());
  39.                 }
  40.         }
  41. }
复制代码
这是什么情况???   真的很纳闷     求高手指教


作者: 朋好友    时间: 2015-3-18 23:32
在单列集合中 list集合可重复  存储有序   
作者: 朋好友    时间: 2015-3-18 23:34
朋好友 发表于 2015-3-18 23:32
在单列集合中 list集合可重复  存储有序

可以用Set集合去重  TreeSet的话是重写hashCode()与equlse()方法
作者: fantacyleo    时间: 2015-3-19 00:42
你重写的equals方法只返回true,完全没有起到判断是否重复的作用
作者: ㏒假™面具    时间: 2015-3-19 01:10
ArrayList本来就是可以重复存储元素的,你重写了equals方法也是没有用的,equals方法只是可以判断元素是否相同,你的代码中没有相同元素就不存储的操作。
作者: 1659177869    时间: 2015-3-19 01:48
没写去除相同元素的方法.
作者: 艺多不压身丶    时间: 2015-3-19 08:00
  1. package pack;
  2. import java.util.*;
  3. class Person{
  4.     private String name;
  5.     private int age;
  6.     public Person(String name,int age){
  7.         this.name = name;
  8.         this.age = age;
  9.     }
  10.     //使用list集合时,想要去除对象中的重复元素,必须复写equals(Object obj)
  11.     public boolean equals(Object obj){
  12.         if(!(obj instanceof Person))
  13.             throw new RuntimeException();
  14.         Person p = (Person) obj;
  15.         return this.name.equals(p.name)&&this.age==p.age;
  16.     }
  17.     public String getName(){
  18.             return name;
  19.     }
  20.     public int getAge(){
  21.             return age;
  22.     }
  23. }
  24. class  DemoTest3{
  25.     public static void main(String[] args) {
  26.         ArrayList list = new ArrayList();
  27.         list.add(new Person("li01",12));
  28.         list.add(new Person("li01",12));
  29.         list.add(new Person("li01",12));
  30.         list.add(new Person("li01",12));
  31.         list.add(new Person("li01",12));
  32.                 list=printCount(list);
  33.         for(Iterator it=list.iterator();it.hasNext();){
  34.             Person p =(Person)it.next();
  35.             System.out.println(p.getName()+p.getAge());
  36.         }
  37.     }
  38.         public static ArrayList printCount(ArrayList al){
  39.                 ArrayList la=new ArrayList();
  40.                 Iterator it=al.iterator();
  41.                 while(it.hasNext()){
  42.                         Object obj=it.next();
  43.                         if(!la.contains(obj))
  44.                                 la.add(obj);
  45.                 }
  46.                 return la;
  47.         }
  48. }
复制代码

作者: H马凯    时间: 2015-3-19 08:26
艺多不压身丶 发表于 2015-3-19 08:00

刚开始我equals方法中return的也是this.name。equals(p.name)&&age==p.age,r可是我定义的equals方法中的输出语句System.out.println("++++++++");都没有执行,所以才改为return true的。
作者: H马凯    时间: 2015-3-19 08:28
㏒假™面具 发表于 2015-3-19 01:10
ArrayList本来就是可以重复存储元素的,你重写了equals方法也是没有用的,equals方法只是可以判断元素是否 ...

不是    去除重复对象这块你没看么?    你准备报考哪一期????
作者: H马凯    时间: 2015-3-19 08:31
fantacyleo 发表于 2015-3-19 00:42
你重写的equals方法只返回true,完全没有起到判断是否重复的作用

不是   关键不在这   问题是我在equals中不是定义了一个输出语句System.out.prinln("++++++++");  他都没执行     其实返回true也是可以的,这样写只是为了让添加的对象默认都相同,只添加第一个对象
作者: H马凯    时间: 2015-3-19 08:37
朋好友 发表于 2015-3-18 23:34
可以用Set集合去重  TreeSet的话是重写hashCode()与equlse()方法

set集合我知道    问题是List集合也是可以的啊
作者: H马凯    时间: 2015-3-19 08:53
H马凯 发表于 2015-3-19 08:26
刚开始我equals方法中return的也是this.name。equals(p.name)&&age==p.age,r可是我定义的equals方法中 ...

你写的能可以??   我复制一下看看
作者: H马凯    时间: 2015-3-19 08:59
H马凯 发表于 2015-3-19 08:26
刚开始我equals方法中return的也是this.name。equals(p.name)&&age==p.age,r可是我定义的equals方法中 ...

恩  懂了     我去  老毕讲时没注意听    把contains这一步给忘了   我说怎么老是不调用equals方法呢   谢了
作者: wenke    时间: 2015-3-19 09:00
List内部设置的本来就可以存重复对象  你如果想不让List存  要改List内部代码  实际是不可能的   如果不想要重复为什么不用sun的set 非要用List   不懂
作者: H马凯    时间: 2015-3-19 09:06
wenke 发表于 2015-3-19 09:00
List内部设置的本来就可以存重复对象  你如果想不让List存  要改List内部代码  实际是不可能的   如果不想 ...

不是   你用Set集合存“对象”时,不复写equals方法和hashCode方法你能去除重复值么?
作者: DxxD    时间: 2015-3-19 09:16
楼上已经指出错误了,就不再赘述了。。。
作者: wenke    时间: 2015-3-19 09:21
地球人都知道 这个还有讨论吗
作者: H马凯    时间: 2015-3-19 09:41
wenke 发表于 2015-3-19 09:21
地球人都知道 这个还有讨论吗

好吧    代码怎么写的   让我瞅瞅    老毕没介绍过   还真不知道
作者: zgjswp    时间: 2015-3-19 10:04
用set集合,重写hashcode和equals方法就行了
作者: H马凯    时间: 2015-3-19 10:23
zgjswp 发表于 2015-3-19 10:04
用set集合,重写hashcode和equals方法就行了

恩恩     




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