现在有list1 和list2两个list,要求是list1中的数据必须是在list2中,不在list2中的数据删除得到新的list1,我不想用两个for循环,还有别的比较好的算法吗,请教各位。

解决方案 »

  1.   

    for (String str : list1)
    {
        if(!list2.contains(str)) {
           list2.add(str);
         }
    }
      

  2.   


          List<String> list1 = new CopyOnWriteArrayList<String>();
          List<String> list2 = new CopyOnWriteArrayList<String>();      list1.add("1");
          list1.add("2");
          list1.add("3");
          list1.add("4");
          
          list2.addAll(list1);
          list1.add("5");
          
          for(String str : list1) {
             if(!list2.contains(str)) {
                list1.remove(str);
             }
          }      System.err.println(java.util.Arrays.toString(list1.toArray()));
       }
      

  3.   

    List的removeAll方法可以直接操作Collection
      

  4.   


    public class ListRemove { public static void main(String[] args) {
    List<String> list=new ArrayList<String>();
    List<String> subList=new ArrayList<String>();
    list.add("0");
    list.add("1");
    list.add("2");
    list.add("3");
    subList.add("0");
    subList.add("2");
    list.removeAll(subList);
    for(String str:list){
    System.out.println(str);
    }
    }}
      

  5.   

    List里面的元素对应的类需要override equals and hashCode 方法。
      

  6.   

    list1中的数据不全在list2中,例如:list1.add("1")
    list1.add("2")
    list1.add("3")
    list1.add("4")
    list1.add("5")而list2中的数据是
    list2.add();
      

  7.   

    for (String str : list1)
    {
     if(!list2.contains(str)) {
     list2.add(str);
     }
    }list1中的数据不全在list2中,例如:list1.add("1")
    list1.add("2")
    list1.add("3")
    list1.add("4")
    list1.add("5")而list2中的数据是
    list2.add("2");
    list2.add("3");
    list2.add("6");
    list2.add("7");
    list2.add("8");
     现在我要得到的list1中数据只有2 和3 用楼上的方法貌似不行, 我用了两个for循环 比对,
      

  8.   

    这个没有达到楼主需求的,人家是要求删除List2里面不存在的元素,你这是删除list2中存在的元素。
      

  9.   

    这还不简单
    org.apache.commons.collections.ListUtils.subtract(java.utils.List arg1,java.utils.List arg2)
      

  10.   

    8楼的方法正解。retainAll(Collection<?> col)方法仅保留该集合中同时包含在指定集合中的对象,其他的全部移除,与removeAll()方法正好相反。返回值为boolean型,如果存在符合移除条件的对象则返回true,否则返回false。
      

  11.   

    list1中的数据不全在list2中,例如:list1.add("1")
    list1.add("2")
    list1.add("3")
    list1.add("4")
    list1.add("5")而list2中的数据是
    list2.add("2");
    list2.add("3");
    list2.add("6");
    list2.add("7");
    list2.add("8");
      现在我要得到的list1中数据只有2和3 而不是1、4、5是在list2中的,这个方法不行 我试了。
      

  12.   

    那你就用
    org.apache.commons.collections.ListUtils.intersection(java.utils.List arg1,java.utils.List arg2)呗唉
      

  13.   

    for example
    list1, list2;
    List tmp = new ArrayList(list1); //获取list1的一个拷贝集合
    tmp.removeAll(list2); //用tmp去掉所有的list2的元素,也就在list2中存在的元素会删除
    list1.removeAll(tmp); //再用list1去掉tmp的剩下的元素,tmp剩下的就是在list2中不存在的
      

  14.   

    不好意思 没看清楚题目
    那么改用retainAll方法。
    public class ListRemove { public static void main(String[] args) {
    List<String> list=new ArrayList<String>();
    List<String> subList=new ArrayList<String>();
    list.add("0");
    list.add("1");
    list.add("2");
    list.add("3");
    subList.add("0");
    subList.add("2");
    list.retainAll(subList);
    for(String str:list){
    System.out.println(str);
    }
    }}