比如:
List1和List2里面每条记录都是form类型。
form里面包含userId,userName三个元素。
现在将上面的List1,List2里面的记录都追到第三个新的list3中,要求list3中不包含数据相同的记录。也就是说list1和list2中都有userId="1",userName="aa"的form(这两个form只是userId,userName值相等,内存地址不同),追加到list3后,list3中只能有一条(userId="1",userName="aa")的form。
请给出最简便的做法。

解决方案 »

  1.   

    list3 = list1;
    list3.removeAll(list2);
    list3.addAll(list2);
      

  2.   

    List list1 = new ArrayList();
    List list2 = new ArrayList();
    List list3 = new ArrayList(list1);for (int i = 0; i < list2.size(); i++) {
      if (!hasSameElement(list3, (Form)list2.get(i))) {
        list3.add(list2.get(i));
      }
    }
    -----------------------------------------------------------------private boolean isSameForm(Form form1, Form form2) {
      return form1.getId().equals(form2.getId());
    }public boolean hasSameElement(List list, Form form) {
      for (int i = 0; i < list.size(); i++) {
        Form form1 = (Form)list.get(i);
        if (isSameForm(form1, form)) {
          return true;
        }
      }
      return false;
    }
    当然,如果你的类可以实现Comparator,会更简单一点。
      

  3.   

    二楼[pdvv(我爱花猫) ]的做法不对,你那做法只能把同一个对象给去掉,两个form虽然里面的值都为[userId="1",userName="aa"],但是他们不是同一个对象。
      

  4.   

    四楼[yin_slin(一生找北)]的做法可以实现,但是时间的代价太大,难道非得自己对每个form里的每个userId都去比较吗。有没有更优的方法呀?
      

  5.   

    遍历list2,取出每个form,看list1中是否有值相同的form,没有就添加进去,没什么简便方法吧。
      

  6.   

    hashmap是可以实现,但是现在从DB中取出的数据就是一个list结构,不可能再把它塞一次到hashmap中再作处理,而且也不方便后面的业务处理
      

  7.   

    我又转回来了,我上面的方法确实只有相同对象才能去掉。不过,稍作改动,重载Form的equals方法就可以实现。public boolean equals(Object obj){
    ……
    Form f = (Form)obj;
    if(f.getUserId().equals(this.getUserId()) && 
       f.getUserName().equals(this.getUserName()))
       return true;
    else
       return false;    }
      

  8.   

    form重载equals、hashCode方法
    Set.addAll
    Set.toArray --> form[]
    form[]--> Arrays.asList --List
      

  9.   

    重载equals()、hashCode()方法是可行的,不过容易出现扩展问题。
    个人觉得实现Comparator接口比较好。纯属个人意见^_^。
      

  10.   

    重载equals方法确实简单。不过如果这个form不能由自己来更改那就没辙了。
    希望还有高手能列出一些其他方法供大家学习!两天后再散分结贴。
      

  11.   

    如果不能改form,那就自己再写一个类包装form类吧,包装类重载equals和hashCode方法。