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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 枫儿 金牌黑马   /  2013-10-25 16:32  /  1630 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

ArrayList去对象重复的问题,编译通过 运行报错 大家帮忙看看代码
  1. import java.util.*;
  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.         public boolean equals(Object obj)
  12.         {

  13.                 if(!(obj instanceof person))
  14.                         return false;

  15.                 person p = (person)obj;
  16.                 //System.out.println(this.name+"....."+p.name);

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

  18.        

  19.         public String getname()
  20.         {
  21.                 return name;
  22.         }
  23.         public int getage()
  24.         {
  25.                 return age;
  26.         }
  27. }
  28. class  Arratlist2
  29. {
  30.         public static void sop(Object obj)
  31.         {
  32.                 System.out.println(obj);
  33.         }
  34.         public static void main(String[] args)
  35.         {
  36.                 ArrayList al=new ArrayList();
  37.                 al.add(new person("zhangsan1",30));
  38.                 al.add(new person("zhangsan2",32));
  39.                 al.add(new person("zhangsan1",33));
  40.                 al.add(new person("zhangsan1",30));
  41.                 al.add(new person("zhangsan1",37));
  42.                 al.add(new person("zhangsan1",36));
  43.         sop(al);
  44.         al=quchongfu(al);
  45.         sop(al);

  46.         Iterator it = al.iterator();


  47.                 while(it.hasNext())
  48.                 {
  49.                         person p = (person)it.next();
  50.                         sop(p.getname()+"::"+p.getage());
  51.                 }
  52.         }

  53.         public static ArrayList quchongfu(ArrayList al)
  54.         {
  55.                 ArrayList newal=new ArrayList();
  56.                 Iterator it = al.iterator();
  57.                 while (!it.hasNext())
  58.                 {
  59.                         Object obj=it.next();
  60.                         if (!newal.contains(obj))
  61.                         {
  62.                                 newal.add(obj);
  63.                         }
  64.                 }
  65.                 return newal;
  66.         }
  67. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

15 个回复

正序浏览
枫儿 金牌黑马 2013-10-25 18:54:44
16#
寻丶丶觅 发表于 2013-10-25 18:46
好吧 你运行错文件了  wenbao的代码生成的是Test.class类  你调用Arraylist2肯定失败的 ...

发现了,嘻嘻  忙了个傍晚了
回复 使用道具 举报
好吧 你运行错文件了  wenbao的代码生成的是Test.class类  你调用Arraylist2肯定失败的
回复 使用道具 举报
枫儿 金牌黑马 2013-10-25 18:40:40
14#
wenbaoxing 发表于 2013-10-25 18:36
不可能,我刚刚把我发的代码复制下来,又运行了一遍,一点问题没有。

你把代码拷贝到你的电脑上后,要保 ...

把异常贴出
回复 使用道具 举报
枫儿 发表于 2013-10-25 18:28
呜呜~~依然运行抛出异常

不可能,我刚刚把我发的代码复制下来,又运行了一遍,一点问题没有。

你把代码拷贝到你的电脑上后,要保证类名和文件名称一致。
也就是说,你的文件名称要是Test.java
回复 使用道具 举报
把你抛出的异常贴出来啊
回复 使用道具 举报
枫儿 金牌黑马 2013-10-25 18:28:04
11#
wenbaoxing 发表于 2013-10-25 18:13
我给你做了详细的注释,你好好看看吧。我觉得你没有对迭代器的那几个方法理解,还有一定要细心,要不然“死 ...

呜呜~~依然运行抛出异常
回复 使用道具 举报
枫儿 金牌黑马 2013-10-25 18:25:52
10#
1961993790 发表于 2013-10-25 17:53
我给你把代码调试过来了,你运行应该能成功,代码如下:
package com.itheima;

感谢回答,不过为何进入循环迭代后还是运行抛出异常
回复 使用道具 举报
本帖最后由 wenbaoxing 于 2013-10-25 18:14 编辑

我给你做了详细的注释,你好好看看吧。我觉得你没有对迭代器的那几个方法理解,还有一定要细心,要不然“死都不知道怎么死的",方老师说过这样的话。
  1. import java.util.*;

  2. //定义一个Person类,类名一般首字母大写
  3. class Person {
  4.         private String name;
  5.         private int age;

  6.         //定义构造函数,相当于规定人对象一初始化就要有姓名和年龄
  7.         Person(String name, int age) {
  8.                 this.name = name;
  9.                 this.age = age;
  10.         }

  11.         //因为后面我们需要将人对象存入集合当中,而集合容器底层需要调用equals方法,所以我们要在这定义一个equals方法
  12.         public boolean equals(Object obj) {

  13.                 //首先判断要比较的对象是不是一个人类的实例,如果不是就不比较,因为拿一个不是人的东西和人比较没有意义
  14.                 if (!(obj instanceof Person))
  15.                         return false;

  16.                 //将我们接收的对象强转成Person
  17.                 Person p = (Person) obj;

  18.                 //这句代码体现的是:同姓名同年龄视为同一个人
  19.                 return this.name.equals(p.name) && this.age == p.age;
  20.         }

  21.         public String getname() {
  22.                 return name;
  23.         }

  24.         public int getage() {
  25.                 return age;
  26.         }

  27.         //我在这里定义了toStirng方法,这样我们在打印对象的时候,底层会自动调用该方法,
  28.         //我们让该方法返回一些人的信息,方便我们观看
  29.         public String toString() {
  30.                 return this.name + ":" + this.age;
  31.         }
  32. }

  33. class Test {
  34.         
  35.         public static void sop(Object obj) {
  36.                 System.out.println(obj);
  37.         }

  38.         public static void main(String[] args) {
  39.                
  40.                 //新建一个集合容器,你先存入四个元素,这样方便观看效果
  41.                 ArrayList al = new ArrayList();
  42.                 al.add(new Person("zhangsan1", 30));
  43.                 al.add(new Person("zhangsan2", 32));
  44.                 al.add(new Person("zhangsan1", 33));
  45.                 al.add(new Person("zhangsan1", 30));
  46.                 // al.add(new person("zhangsan1",37));
  47.                 // al.add(new person("zhangsan1",36));
  48.                
  49.                 //打印原集合
  50.                 sop("原集合是:" + al);
  51.                 al = quchongfu(al);
  52.                
  53.                 //打印我们修改之后的集合
  54.                 sop("去重复后是:" + al);

  55.                 //以下的这几个代码是让你练习使用迭代器遍历集合的
  56.                 Iterator it = al.iterator();
  57.                 while (it.hasNext()) {
  58.                         Person p = (Person) it.next();
  59.                         sop(p.getname() + "::" + p.getage());
  60.                 }
  61.         }

  62.         public static ArrayList quchongfu(ArrayList al) {
  63.                
  64.                 //新建一个集合容器
  65.                 ArrayList newal = new ArrayList();
  66.                
  67.                 //遍历原集合,每取到一个元素都要在我们刚刚建立的这个容器中查找一下,
  68.                 //只有新容器中不存在时我们才将这个元素add到集合中。通过这些代码可以发现contains底层调用的是equals方法
  69.                 Iterator it = al.iterator();
  70.                 //it.hasNext()的意思是:如果集合中还有元素,返回ture,否则返回false。
  71.                 //你如果改成(!it.hasNext()),那么第一次运行时这句代码的运算结果就是false,
  72.                 //                                           直接就执行下面return newal;这句代码了,这样会返回一个空数组
  73.                 while (it.hasNext()) {                        //你的源代码中多了!,
  74.                         Object obj = it.next();
  75.                         if (!newal.contains(obj)) {
  76.                                 newal.add(obj);
  77.                         }
  78.                 }
  79.                 return newal;
  80.         }
  81. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
我给你把代码调试过来了,你运行应该能成功,代码如下:
package com.itheima;

import java.util.*;

class person {
        private String name;
        private int age;

        person(String name, int age) {
                this.name = name;
                this.age = age;
        }

        public boolean equals(Object obj) {

                if (!(obj instanceof person))
                        return false;

                person p = (person) obj;
                // System.out.println(this.name+"....."+p.name);

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

        public String getname() {
                return name;
        }

        public int getage() {
                return age;
        }
}

class Arratlist2 {
        public static void sop(Object obj) {
                System.out.println(obj);
        }

        public static void main(String[] args) {
                ArrayList al = new ArrayList();
                al.add(new person("zhangsan1", 30));
                al.add(new person("zhangsan2", 32));
                al.add(new person("zhangsan1", 33));
                al.add(new person("zhangsan1", 30));
                al.add(new person("zhangsan1", 37));
                al.add(new person("zhangsan1", 36));
                sop(al);
                al = quchongfu(al);
                sop(al);

                Iterator it = al.iterator();
                while (it.hasNext()) {
                        person p = (person) it.next();
                        sop(p.getname() + "::" + p.getage());
                }
        }

        public static ArrayList quchongfu(ArrayList al) {
                ArrayList newal = new ArrayList();
                Iterator it = al.iterator();
                while (it.hasNext()) {
                        Object obj = it.next();
                        if (!newal.contains(obj)) {
                                newal.add(obj);
                        }
                }
                return newal;
        }
}
你的主要错误就是   while (!it.hasNext()) 这行代码 正确的为   while (it.hasNext())
主要原因就是:你这里运用的iterator对集合进行迭代,你可能对调用的it.hasNext()可能没有
正确理解,当迭代while(it.hasNext)是判断是否有下一个元素,如果有的话就会返回true否则返回false
这里你对it集合进行迭代,显然it.hsNext返回true,然而你while判断中是  (!it.hasNext()) 所以导致
程序无法进入while循环,所以无法删除相同的对象,所以导致输出结果错误。
希望对您有帮助,祝您学习愉快!

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
import java.util.*;
class person
{
        private String name;
        private int age;
        person(String name,int age)
        {
        this.name=name;
        this.age=age;
        }
        public boolean equals(Object obj)
        {

                if(!(obj instanceof person))
                        return false;

                person p = (person)obj;
                //System.out.println(this.name+"....."+p.name);

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

        

        public String getname()
        {
                return name;
        }
        public int getage()
        {
                return age;
        }
}
class  Test1
{
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
        public static void main(String[] args)
        {
                ArrayList al=new ArrayList();
                al.add(new person("zhangsan1",30));
                al.add(new person("zhangsan2",32));
                al.add(new person("zhangsan1",33));
                al.add(new person("zhangsan1",30));
                al.add(new person("zhangsan1",37));
                al.add(new person("zhangsan1",36));
        sop(al);
        al=quchongfu(al);
        sop(al);

        Iterator it = al.iterator();


                while(it.hasNext())
                {
                        person p = (person)it.next();
                        sop(p.getname()+"::"+p.getage());
                }
        }

        public static ArrayList quchongfu(ArrayList al)
        {
                ArrayList newal=new ArrayList();
                Iterator it = al.iterator();
                while (it.hasNext())
                {
                        Object obj=it.next();
                        if (!newal.contains(obj))
                        {
                                newal.add(obj);
                        }
                }
                return newal;
        }
}
代码送上 我运行没问题

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
寻丶丶觅 发表于 2013-10-25 16:59
改成while(it.hasNext())晕 当指针不为空时,返回的是true,你要遍历该集合才能判断啊
55行你写了一个迭代 ...

一样运行通不过
回复 使用道具 举报
hasNext() 方法,如果仍有元素可以迭代,则返回 true。
你看看老毕关于迭代器的视频,讲关于迭代器原理,指针的指向。有图讲解的,讲的很生动
回复 使用道具 举报
改成while(it.hasNext())晕 当指针不为空时,返回的是true,你要遍历该集合才能判断啊
55行你写了一个迭代过程了,这个怎么就不明白了
回复 使用道具 举报
寻丶丶觅 发表于 2013-10-25 16:49
验证了下,运行没有报错。关键在于你的quchongfu(ArrayList al)方法。
66行while (!it.hasNext()) 循环没有 ...

while (!it.hasNext())怎么会不循环呢 正确代码该怎么改
回复 使用道具 举报
验证了下,运行没有报错。关键在于你的quchongfu(ArrayList al)方法。
66行while (!it.hasNext()) 循环没有运行,就这点小问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马