黑马程序员技术交流社区

标题: 为何无法去除重复。感觉和视频一样啊?? [打印本页]

作者: 追逐    时间: 2014-3-22 10:43
标题: 为何无法去除重复。感觉和视频一样啊??
本帖最后由 追逐 于 2014-3-25 14:40 编辑

import java.util.ArrayList;
import java.util.Iterator;

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

思路:
1、找人描述,将数据封装进人对象。
2、定义容器,将人存入。
3、取出。
*/

  1. //定义人类
  2. class Person
  3. {
  4.         private String name;
  5.         private int age;
  6.         Person(String name, int age)
  7.         {
  8.                 this.name = name;
  9.                 this.age = age;
  10.         }

  11.         //重写equals方法。判断容器中的元素是否相同
  12.         public boolean equals(Object obj)
  13.         {
  14.                 if(!(obj instanceof Person)) //判断一下Person是否属于Obj类。不是的话就返回false
  15.                         return false;
  16.                 Person p = (Person)obj; //因为传入的数据在传入时类型自动提升了。所以在次数需要把类型向下强制转型
  17.                 System.out.println(p.getName());
  18.                 return this.name.equals(p.name) && this.age == p.age;
  19.         }
  20.         
  21.         //设置名字
  22.         public void setName(String name)
  23.         {
  24.                 this.name = name;
  25.         }
  26.         
  27.         //取出名字
  28.         public String getName()
  29.         {
  30.                 return name;
  31.         }
  32.         
  33.         //设置年龄
  34.         public void setAge(int age)
  35.         {
  36.                 this.age = age;
  37.         }

  38.         //取出年龄
  39.         public int getAge()
  40.         {
  41.                 return age;
  42.         }

  43. }

  44. class ArrayListTest1
  45. {
  46.         public static void main(String[] args)
  47.         {
  48.                 //创建一个容器
  49.                 ArrayList al = new ArrayList();
  50.                 al.add(new Person("张三", 31));
  51.                 al.add(new Person("张四", 32));
  52.                 al.add(new Person("张三", 31));
  53.                 al.add(new Person("张四", 32));
  54.                 al.add(new Person("张五", 33));
  55.                 al.add(new Person("张六", 34));

  56.                 //取出名字   创建迭代器
  57.                 Iterator it = al.iterator();
  58.                 for( ;it.hasNext(); ) //判断容器中是否还有元素存在。有就往下执行
  59.                 {
  60.                         Person p = (Person)it.next(); //因为it.next()返回的是一个Object类型的元素。所以需要向下转型
  61.                         System.out.println(p.getName() + ":::::" + p.getAge());
  62.                 }
  63.         }
  64. }
复制代码
运行结果是:
而毕老师的视频上却可以去除重复的。求大神指教一下。我的到底错在哪里了吗?
我已经找了n遍。却始终无法找到错在何处


作者: 追逐    时间: 2014-3-22 10:54
本帖最后由 追逐 于 2014-3-22 11:08 编辑

但是还没学习到Set,而且现在遇到这种问题也不能不修改啊。忘各位路过的大神指点一下
作者: 捌年    时间: 2014-3-22 11:08
ArrayList本来就是可以存储重复的元素的吧,你要弄一个方法去删除重复的
作者: 追逐    时间: 2014-3-22 11:42
现在就是删除重复的方法不能用了 的。
作者: 捌年    时间: 2014-3-22 12:51
ArrayList需要你自己调用remove方法去删除重复元素,Set集合因为它本身不能存储重复的元素,所以只需要复写hashCode和equals方法或者CompareTo方法就行
作者: 我感觉优势很大    时间: 2014-3-22 14:57
  1. import java.util.ArrayList;
  2. import java.util.Iterator;

  3. //List集合判断元素是否相同,依据是元素的equals方法
  4. public class ArrayListDemo2 {

  5.         public static void main(String[] args) {
  6.                 // TODO Auto-generated method stub
  7.                 ArrayList<Person> al=new ArrayList<Person>();
  8.                
  9.                 al.add(new Person("lisi01",31));
  10.                 al.add(new Person("lisi01",31));
  11.                 al.add(new Person("lisi02",32));
  12.                 al.add(new Person("lisi03",33));
  13.                 al.add(new Person("lisi03",33));
  14.                
  15.                 Iterator<Person> it=al.iterator();
  16.                 while(it.hasNext())
  17.                 {
  18.                         Person p=it.next();
  19.                         System.out.println(p.getName()+"..."+p.getAge());
  20.                 }
  21.                
  22.                 al=singleElement(al);
  23.                
  24.                 System.out.println("-----------------------");
  25.                
  26.                 Iterator<Person> it1=al.iterator();
  27.                 while(it1.hasNext())
  28.                 {
  29.                         Person p=it1.next();
  30.                         System.out.println(p.getName()+"..."+p.getAge());
  31.                 }
  32.         }
  33.        
  34.        
  35.         public static ArrayList singleElement(ArrayList al){
  36.                 ArrayList newAl=new ArrayList();
  37.                
  38.                 Iterator it=al.iterator();
  39.                 while(it.hasNext())
  40.                 {
  41.                         Object obj=it.next();
  42.                         if(!newAl.contains(obj))//contains方法调用元素的equals方法,看是否是相同元素
  43.                         {
  44.                                 newAl.add(obj);
  45.                         }
  46.                 }
  47.                 return newAl;
  48.                
  49.         }

  50. }

  51. class Person{
  52.         private String name;
  53.         private int age;
  54.         public Person(String name, int age) {
  55.                 this.name = name;
  56.                 this.age = age;
  57.         }
  58.         public String getName() {
  59.                 return name;
  60.         }
  61.         public void setName(String name) {
  62.                 this.name = name;
  63.         }
  64.         public int getAge() {
  65.                 return age;
  66.         }
  67.         public void setAge(int age) {
  68.                 this.age = age;
  69.         }
  70.         @Override
  71.         public boolean equals(Object obj) {
  72.                 // TODO Auto-generated method stub
  73.                 if(!(obj instanceof Person))
  74.                         return false;
  75.                 Person p=(Person)obj;
  76.                 return this.name.equals(p.getName())&&this.age==p.getAge();
  77.         }
  78. }
复制代码
这个list集合是自己写方法删除重复元素,里面的那个 singleElement()方法,就是去除重复元素的,

作者: 追逐    时间: 2014-3-22 15:30
本帖最后由 追逐 于 2014-3-22 15:51 编辑

我感觉优势很大 发表于 2014-3-22 14:57
这个list集合是自己写方法删除重复元素,里面的那个 singleElement()方法,就是去除重复元素的,[/backco ...

这个是输出结果,请大神在帮忙改改 了
作者: duanyoujiji    时间: 2014-3-22 16:07
list中的元素可以重复,但是要保证list元素的唯一,就重写equals方法,但是你没有自己定义去除重复元素的方法,也就是说即使你覆盖了equals方法,但是他们还都存在list里面,jvm已经知道他们是重复的但是没有删除,你没有个jvm删除的方法。
很明显缺少代码,最少应该定义两个list?没写全吧。7楼写的对,你看看吧。
作者: 追逐    时间: 2014-3-22 17:33
明白了了。运行通过 了。谢谢各位的帮助
作者: 我感觉优势很大    时间: 2014-3-22 17:42
追逐 发表于 2014-3-22 15:30
这个是输出结果,请大神在帮忙改改 了

你运行的是我的程序么?

作者: 追逐    时间: 2014-3-22 18:01
恩恩是的
作者: yanzhendong    时间: 2014-3-22 20:21
楼主你好,
作者: yanzhendong    时间: 2014-3-22 21:04
楼主你好,你只需要在每次插入操作前执行contain()函数即可解决问题,因为你虽然重写了equals()函数,但却没有去调用它,一下是我的建议代码:
  1. import java.util.ArrayList;
  2. import java.util.Iterator;

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

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


  11. //定义人类

  12. class Person

  13. {

  14.         private String name;

  15.         private int age;

  16.         Person(String name, int age)

  17.         {

  18.                 this.name = name;

  19.                 this.age = age;

  20.         }



  21.         //重写equals方法。判断容器中的元素是否相同

  22.         public boolean equals(Object obj)

  23.         {

  24.                 if(!(obj instanceof Person)) //判断一下Person是否属于Obj类。不是的话就返回false

  25.                         return false;

  26.                 Person p = (Person)obj; //因为传入的数据在传入时类型自动提升了。所以在次数需要把类型向下强制转型

  27.                 System.out.println(p.getName());

  28.                 return this.name.equals(p.name) && this.age == p.age;

  29.         }

  30.         

  31.         //设置名字

  32.         public void setName(String name)

  33.         {

  34.                 this.name = name;

  35.         }

  36.         

  37.         //取出名字

  38.         public String getName()

  39.         {

  40.                 return name;

  41.         }

  42.         

  43.         //设置年龄

  44.         public void setAge(int age)

  45.         {

  46.                 this.age = age;

  47.         }



  48.         //取出年龄

  49.         public int getAge()

  50.         {

  51.                 return age;

  52.         }



  53. }



  54. class ArrayListTest1

  55. {

  56.         public static void main(String[] args)

  57.         {

  58.                 //创建一个容器

  59.                 ArrayList al = new ArrayList();
  60.                p1=new Person("张三",31);
  61.                p2=new Person("张四",38);
  62.                p3=new Person("张五",31);
  63.                p4=new Person("张六",36);      
  64.                p5=new Person("张七",39);
  65.                p6=new Person("张四",38);
  66.                p7=new Person("张三",31);
  67.                for(int i=0;i<7;i++){
  68.                   if(!al.contains(p1))
  69.                     al.add(p1);
  70.                  if(!al.contains(p2))
  71.                     al.add(p);
  72.                  if(!al.contains(p3))
  73.                     al.add(p3);
  74.                   if(!al.contains(p4))
  75.                     al.add(p4);
  76.                    if(!al.contains(p5))
  77.                     al.add(p5);
  78.                       if(!al.contains(p6))
  79.                     al.add(p6);
  80.                     if(!al.contains(p7))
  81.                     al.add(p7);
  82.                   
  83.                      
  84.                   
  85.                      


  86.              }

  87.                 //取出名字   创建迭代器

  88.                 Iterator it = al.iterator();

  89.                 for( ;it.hasNext(); ) //判断容器中是否还有元素存在。有就往下执行

  90.                 {

  91.                         Person p = (Person)it.next(); //因为it.next()返回的是一个Object类型的元素。所以需要向下转型


  92.                         System.out.println(p.getName() + ":::::" + p.getAge());

  93.                 }

  94.         }

  95. }
复制代码

作者: yanzhendong    时间: 2014-3-22 21:06
补充一句,好像contains()会去调用equals()函数,就是这样了,求给分




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