黑马程序员技术交流社区

标题: 数组去重问题 [打印本页]

作者: 一顿一只牛    时间: 2014-8-8 22:48
标题: 数组去重问题
本帖最后由 一顿一只牛 于 2014-8-9 10:21 编辑

         //去除重复元素。
        public static ArrayList quChong(ArrayList al){
                 //定义一个临时容器。
                ArrayList a2 = new ArrayList();
                Iterator it = al.iterator();
                while(it.hasNext()){
                        Object obj = it.next();
                                if(!a2.contains(obj))
                                        a2.add(obj);
                }
                return a2;
        }

         //自定义比较方法,比较名字和年龄。
                public boolean equals(Object obj){
                        if(!(obj instanceof Person))
                                return false;
                        Person p = (Person)obj;
                        return this.name.equals(p.name) && this.age == p.age;
                }
请问大神,自定义的equals方法是在if(!a2.contains(obj))语句中调用了吗?
作者: 李林_    时间: 2014-8-9 00:19
   public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }
    public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))   //1
                    return i;
        }
        return -1;
    }
这是底层实现代码
1 这里用的eq是调用了父类的Object  中的eq方法
   public boolean equals(Object obj) {
        return (this == obj);
    }
所有类的父类都是
当你重写了eq方法后会多态到你重写的eq方法中   
请问大神,自定义的equals方法是在if(!a2.contains(obj))语句中调用了吗?  是的

但是  
    public static ArrayList quChong(ArrayList al){
                 //定义一个临时容器。
                ArrayList a2 = new ArrayList();
                Iterator it = al.iterator();
                while(it.hasNext()){
                        Object obj = it.next();
                                if(!a2.contains(obj))
                                        a2.add(obj);
                }
                return a2;
        }
既然是去重   是不是要考虑  把集合里的东西先清空

作者: 一顿一只牛    时间: 2014-8-9 00:32
李林_ 发表于 2014-8-9 00:19
public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }

why清空。 我们不是new了一个新的ArrayList了吗?
新建一个集合把旧集合没有重复的元素放在一起不就行了嘛?用contains判断
   然后我现在想问的是我们自定义的equasl方法是在quChong方法中调用的吗?
作者: 舍我其谁    时间: 2014-8-9 00:36
这个真不懂,受教了
作者: 地狱天堂    时间: 2014-8-9 02:15
List 中 contains remove判断元素相同 底层调用了 equals方法 。
contains(Object o)
如果此列表中包含指定的元素,则返回 true。更确切地讲,当且仅当此列表包含至少一个满足 (o==null ? e==null : o.equals(e)) 的元素 e 时,则返回 true。
详见:毕老->第14天javaAPI->集合框架(ArrayList练习2)视频16分20秒
作者: 黑马黄武先    时间: 2014-8-9 02:36
虽然不懂,但是也快了!谢谢
作者: 一顿一只牛    时间: 2014-8-9 10:21
地狱天堂 发表于 2014-8-9 02:15
List 中 contains remove判断元素相同 底层调用了 equals方法 。
contains(Object o)
如果此列表中包含指定 ...

{:2_36:} 谢大神指点。
作者: yuli2039    时间: 2014-8-9 10:33
楼主舍近求远,直接将元素存入HashSet集合不就欧了么!存入HashSet集合会调用hashCode和equals方法保证唯一性
作者: 心之信子    时间: 2014-8-9 22:17
谢谢分享
作者: 渴望学习    时间: 2014-8-9 22:46
路过~~~~
作者: 黑马_java猿    时间: 2014-8-9 23:02
2楼回答 不错




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