有这样2个list;
     List<User> list1 = new ArrayList();
    User u1 = new User();
    u1.setName("a");
    u1.setAge(21);    User u2 = new User();
    u2.setName("b");
    u2.setAge(22);    User u3 = new User();
    u3.setName("c");
    u3.setAge(23);     list1.add(u1);
     list1.add(u2);
     list1.add(u3);
 List<User> list2 = new ArrayList();
    User u4 = new User();
    u4.setName("a");
    u4.setAge(21);    User u5 = new User();
    u5.setName("b");
    u5.setAge(22);    User u6 = new User();
    u6.setName("cc");
    u6.setAge(28);     list2.add(u4);
     list2.add(u5);
     list2.add(u6);   目的需要实现这样一个方法:
   List<User> getBoth(List<User> list1, List<User> list2){
       return null;
   }
  方法返回:根据User类中name相同的那些类的list  如:当前例子应该返回的list中包含u4 u5 或  u1 u2      
 如果直接使用
         for(User u1:list1){
for(User u2:list2){
if(u1.getName().equals(u2.getName())){
list.add(u1); 
}
}
}
         返回list,虽然能实现功能,但效率上不是很高,求一个比这个效率高一些的实现方式,谢谢~!~
    

解决方案 »

  1.   

    看看这个:import java.util.ArrayList;
    import java.util.List;public class Test{
    public static void main(String[]args){
     List <User> list1 = new ArrayList<User>(); 
        User u1 = new User(); 
        u1.setName("a"); 
        u1.setAge(21);      User u2 = new User(); 
        u2.setName("b"); 
        u2.setAge(22);      User u3 = new User(); 
        u3.setName("c"); 
        u3.setAge(23);      list1.add(u1); 
        list1.add(u2); 
        list1.add(u3); 
    List <User> list2 = new ArrayList<User>(); 
        User u4 = new User(); 
        u4.setName("a"); 
        u4.setAge(21);      User u5 = new User(); 
        u5.setName("b"); 
        u5.setAge(22);      User u6 = new User(); 
        u6.setName("cc"); 
        u6.setAge(28);      list2.add(u4); 
        list2.add(u5); 
        list2.add(u6); 
        
        getBoth(list1,list2); }

    static void  getBoth(List <User> list1, List <User> list2){ 
    List<User> list=new ArrayList<User>();
       for(User u1:list1){ 
       for(User u2:list2){ 
       if(u1.getName().equals(u2.getName())){ 
       list2.remove(u2);//此后就不会比较这个了。
       list.add(u1); 
       } 
       } 
       } 
       for(User u:list){
       System.out.println(u.getName());
       }
      } }
      

  2.   

    MARK,一直都没想到好办法,学习一下
      

  3.   

    API不是提供了现成的方法吗
    list1.retainAll(list2);
      

  4.   

    User u2:list2;//给个初值
    for(User u1,User u2;list2;User u2:list1){ 
                   
                   if(u1.getName().equals(u2.getName())){ 
                       list.add(u1);
                       User u1:list1 firstElem;//把list1的第一个再给u1 
                       User u2:list2;//再把list2中下个元素赋给U2
                    }
    }这个算法类似于打印九九乘法口诀表的最优算法,楼主可以在CSDN里找一下,我以前看过这个问题。
      

  5.   

    最好先给 User 类加上 equals 方法。
      

  6.   

    public boolean equals(Object obj){
    if (obj instanceof User) {
    User nUser = (User) obj;
    return (name.equals(nUser.name)&&(age==nUser.age));
    }
    return super.equals(obj);
    }
      

  7.   

    API不是提供了现成的方法吗 
    list1.retainAll(list2);但是在这之前最好使用HasCode和Eqauls方法java.util.Connections
      

  8.   

    楼主可以先把 一个List1 通过for 放到HashMap 里面,
    然后再for 另一个list2 通过 list2的值放到上面HashMap作为key去拿值,如果拿到,
    就说明相等,否则没有此值。
    ==========================================================================
    大体于下
    for(A a : aList){   
       map.put(a.amount,a);   
    }   
      
    for(B b : bList){   
       A a = map.get(b.amount);   
       if(a==null){   
          //a==null则说明没有同b匹配的项   
       }else{   
          //a!=null则说明匹配上了   
       }   
    }  
      

  9.   

    可以用List的contains()方法:
    [code=Java]
    import java.util.ArrayList;
    import java.util.List;public class Test {
    public static void main(String[] args) {
    List<User> list1 = new ArrayList<User>();
    User u1 = new User();
    u1.setName("a");
    u1.setAge(21); User u2 = new User();
    u2.setName("b");
    u2.setAge(22); User u3 = new User();
    u3.setName("c");
    u3.setAge(23); list1.add(u1);
    list1.add(u2);
    list1.add(u3); List<User> list2 = new ArrayList<User>();
    User u4 = new User();
    u4.setName("a");
    u4.setAge(21); User u5 = new User();
    u5.setName("b");
    u5.setAge(22); User u6 = new User();
    u6.setName("cc");
    u6.setAge(28); list2.add(u4);
    list2.add(u5);
    list2.add(u6); getBoth(list1, list2); }

    private static void getBoth(List<User> list1, List<User> list2) {
    List<User> list = new ArrayList<User>();

    for(User u : list1) {
    if(list2.contains(u)) {
    list.add(u);
    }
    } for (User u : list) {
    System.out.println(u.getName());
    }
    }}class User {
    String name;
    int age; public String getName() {
    return name;
    } public void setName(String name) {
    this.name = name;
    } public int getAge() {
    return age;
    } public void setAge(int age) {
    this.age = age;
    } /**
     * {@inheritDoc}
     * 
     * @see java.lang.Object#equals(java.lang.Object)
     */
    public boolean equals(Object obj) {
    if (obj == this)
    return true; if (obj == null)
    return false; if (!(obj instanceof User))
    return false; return name.equals(((User) obj).getName());
    }}
    [code]
      

  10.   

    这个与列表的大小也有关的,如果列表内的数据很少的话,楼主就不用考虑效率的问题,但如果数据量很大的话,建议先把数据压到Map中,用Map的contain方法会好些.