A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  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. }
复制代码
这是什么情况???   真的很纳闷     求高手指教

20 个回复

倒序浏览
在单列集合中 list集合可重复  存储有序   
回复 使用道具 举报
朋好友 发表于 2015-3-18 23:32
在单列集合中 list集合可重复  存储有序

可以用Set集合去重  TreeSet的话是重写hashCode()与equlse()方法
回复 使用道具 举报
你重写的equals方法只返回true,完全没有起到判断是否重复的作用
回复 使用道具 举报
ArrayList本来就是可以重复存储元素的,你重写了equals方法也是没有用的,equals方法只是可以判断元素是否相同,你的代码中没有相同元素就不存储的操作。
回复 使用道具 举报
没写去除相同元素的方法.
回复 使用道具 举报
  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. }
复制代码
回复 使用道具 举报 1 0

刚开始我equals方法中return的也是this.name。equals(p.name)&&age==p.age,r可是我定义的equals方法中的输出语句System.out.println("++++++++");都没有执行,所以才改为return true的。

点评

现在就能打印出来了  发表于 2015-3-19 08:38
回复 使用道具 举报
㏒假™面具 发表于 2015-3-19 01:10
ArrayList本来就是可以重复存储元素的,你重写了equals方法也是没有用的,equals方法只是可以判断元素是否 ...

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

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

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

你写的能可以??   我复制一下看看
回复 使用道具 举报
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:55
14#
List内部设置的本来就可以存重复对象  你如果想不让List存  要改List内部代码  实际是不可能的   如果不想要重复为什么不用sun的set 非要用List   不懂
回复 使用道具 举报
wenke 发表于 2015-3-19 09:00
List内部设置的本来就可以存重复对象  你如果想不让List存  要改List内部代码  实际是不可能的   如果不想 ...

不是   你用Set集合存“对象”时,不复写equals方法和hashCode方法你能去除重复值么?
回复 使用道具 举报
DxxD 中级黑马 2015-3-19 09:16:59
16#
楼上已经指出错误了,就不再赘述了。。。
回复 使用道具 举报
wenke 中级黑马 2015-3-19 09:21:13
17#
地球人都知道 这个还有讨论吗
回复 使用道具 举报
wenke 发表于 2015-3-19 09:21
地球人都知道 这个还有讨论吗

好吧    代码怎么写的   让我瞅瞅    老毕没介绍过   还真不知道
回复 使用道具 举报
用set集合,重写hashcode和equals方法就行了
回复 使用道具 举报
zgjswp 发表于 2015-3-19 10:04
用set集合,重写hashcode和equals方法就行了

恩恩     
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马