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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李志广 中级黑马   /  2012-7-30 19:01  /  2321 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 007lzg 于 2012-7-31 07:52 编辑

//将自定义对象作为元素存到ArrayList集合中,并去除重复元素。
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;
                return this.name.equals(p.name)&&this.age==p.age;
                }
        public void setName(String name)
                {
                this.name=name;
                }
        public String getName()
                {
                return name;
                }
        public void setAge(int age)
                {
                this.age=age;
                }
        public int getAge()
                {
                return age;
                }
}
class ArrayListTest2
{
        public static void sop(Object obj)
                {
                System.out.println(obj);
                }
        public static void main(String[] name)
                {
                ArrayList al=new ArrayList();
                al.add(new Person("lishi",30));
                al.add(new Person("lishi",32));
                al.add(new Person("lishi",32));
                al.add(new Person("lishi",34));
                al.add(new Person("lishi",34));
                al=singleElements(al);
                Iterator it=al.iterator();
                while(it.hasNext())
                        {
                        Person p=(Person)it.next();
                        System.out.println(p.getName()+":"+p.getAge());
                        }
                }
                public static ArrayList singleElements(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;
                        }
}


这是毕老师视频中的例子:
我不明白的是难道判断List集合元素的是否相同,是不是必须用红色部分的代码?
判断List元素是否相同,用equals方法不就行了吗?
为什么还得定义一个临时的容器呢???有没有更好的方法呢?{:soso_e100:}

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
public static ArrayList singleElements(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;
                         }
这部分代码定义的是一个迭代器,用来对元素进行遍历。
回复 使用道具 举报
本帖最后由 郑正华 于 2012-7-30 20:22 编辑

毕老师没有说吗。list集合中判断对象元素是否相同,其实用的就是equals方法,判断容器中是否包含某种元素,用的就是contains()方法,contains()方法的底层原理用的就是equals方法,你可以查API,里面讲到当且仅当此collection至少包含一个满足(o==null ? e ==null : o.equals(e))的元素e时,返回true。
如果你想用你自己的比较方法,那就覆写父类object的equals方法。毕老师的这段代码中就有。

回复 使用道具 举报
本帖最后由 张雪磊 于 2012-7-30 20:11 编辑


{:soso_e103:}
回复 使用道具 举报
{
                         ArrayList newAl=new ArrayList();//定义一个临时容器
                         Iterator it=al.iterator();
                         while(it.hasNext())
                                 {
                                 Object obj=it.next();
                                 if(!newAl.contains(obj))
                                         newAl.add(obj);
                                 }
                                 return newAl;
这段代码的意思是先定义一个容器,然后利用迭代,将元集合的元素一个个的存入到新的临时容器中,在加入的过程中,有一个判断,那就是if(!newAl.contains(obj)),即如果要存入的元素已经在了新的容器中,那么就不存了,通过这个方法,可以把重复的元素给抛出去。
其实重点就在contains方法中的底层运用到了equals方法,这也是person类中,复写equals方法的原因。

至于简单的方法,不知道,其实用set可以实现去掉重复的元素。
也不大简单,也不知道有没有更简单的。
  1. import java.util.ArrayList;
  2. import java.util.Collection;
  3. import java.util.Comparator;
  4. import java.util.HashSet;
  5. import java.util.Iterator;
  6. import java.util.TreeSet;

  7. public class Setaaaa {
  8.         public static void main(String[] args)
  9.         {
  10.                 ArrayList al=new ArrayList();
  11.                 al.add(new Person("zhangsan",21));
  12.                 al.add(new Person("zhangsan",22));
  13.                 al.add(new Person("zhangsan",21));

  14.                 TreeSet ts=new TreeSet(new MyComaparet());
  15.                 ts.addAll(al);
  16.                 Iterator it=ts.iterator();
  17.                 while(it.hasNext()){
  18.                         Person p=(Person)it.next();
  19.                         sop(p.getName()+"-------"+p.getAge());
  20.                 }
  21.         }
  22.                 public static void sop(Object obj){
  23.                                 System.out.println(obj);
  24.                         }
  25.        

  26. }
  27. class MyComaparet implements Comparator{//定义一个比较器
  28.         public int compare(Object obj1,Object obj2){
  29.                 Person s1=(Person)obj1;
  30.                 Person s2=(Person)obj2;
  31.                 if(s1.getAge()==s2.getAge()&&s1.getName().equals(s2.getName()))
  32.                         return 0;
  33.                 return 1;
  34.         }
  35. }
  36. class Person
  37.                 {
  38.                         private String name;
  39.                         private int age;
  40.                         Person(String n,int a){
  41.                                 this.name=n;
  42.                                 this.age=a;       
  43.                         }
  44.                         public String getName(){
  45.                                 return name;
  46.                         }
  47.                         public int getAge(){
  48.                                 return age;
  49.                         }

  50.                 }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马