以下是源码 可是最后打印输出的结果是
第一个集合
  George  Jim  John  Blake  Kevin  Micheal
第二个集合
  George  Jim  John  Blake  Kevin  Micheal
两个集合的交
  George  Kevin  Micheal
两个集合的并
  George  Kevin  Micheal  George  Katie  Micheal  Kevin  Ryan
两个集合的差
为什么“两个集合的差”后面没有显示???!
import java.util.*;
public class ListTest {
public static void main(String[] args) {
List<String> ls = new ArrayList<String>();
List<String> ls2 = new ArrayList<String>();
ls.add("George");
ls.add("Jim");
ls.add("John");
ls.add("Blake");
ls.add("Kevin");
ls.add("Micheal");
ls2.add("George");
ls2.add("Katie");
ls2.add("Micheal");
ls2.add("Kevin");
ls2.add("Ryan");
System.out.println("第一个集合");//打印输出第一个集合
ListIterator lit0 = ls.listIterator();
while (lit0.hasNext()) {
System.out.print("  " + lit0.next());
}
System.out.println();
System.out.println("第二个集合");//打印输出第二个集合
lit0 = ls.listIterator();
while (lit0.hasNext()) {
System.out.print("  " + lit0.next());
}
System.out.println();
ls.retainAll(ls2);
System.out.println("两个集合的交");
lit0 = ls.listIterator();
while (lit0.hasNext()) {
System.out.print("  " + lit0.next());
}
System.out.println();
ls.addAll(ls2);// 两个集合的并
System.out.println("两个集合的并");
lit0 = ls.listIterator();
while (lit0.hasNext()) {
System.out.print("  " + lit0.next());
}
System.out.println();
ls.removeAll(ls2);// 两个集合的差
System.out.println("两个集合的差");
lit0 = ls.listIterator();
while (lit0.hasNext()) {
System.out.print("  " + lit0.next());
}

解决方案 »

  1.   


    import java.util.*;public class ListTest {
    public static void main(String[] args) {
    List<String> ls = new ArrayList<String>();
    List<String> ls2 = new ArrayList<String>();
    ls.add("George");
    ls.add("Jim");
    ls.add("John");
    ls.add("Blake");
    ls.add("Kevin");
    ls.add("Micheal");
    ls2.add("George");
    ls2.add("Katie");
    ls2.add("Micheal");
    ls2.add("Kevin");
    ls2.add("Ryan");
    System.out.println("第一个集合");// 打印输出第一个集合
    ListIterator lit0 = ls.listIterator();
    while (lit0.hasNext()) {
    System.out.print("  " + lit0.next());
    }
    System.out.println();
    System.out.println("第二个集合");// 打印输出第二个集合
    lit0 = ls2.listIterator();
    while (lit0.hasNext()) {
    System.out.print("  " + lit0.next());
    }
    System.out.println();

    jiao(ls, ls2);
    System.out.println();

    System.out.println("两个集合的并");
    lit0 = bing(ls, ls2).listIterator();
    while (lit0.hasNext()) {
    System.out.print("  " + lit0.next());
    }

    System.out.println();
    cha(ls,ls2);
    }

    public static void jiao(List ls, List ls2) {
    System.out.println("两个集合的交");
    List list = new ArrayList(Arrays.asList(new Object[ls.size()])); 
    Collections.copy(list, ls);
    list.retainAll(ls2);
    Iterator lit0 = list.listIterator();
    while (lit0.hasNext()) {
    System.out.print("  " + lit0.next());
    }
    }

    public static List bing(List ls, List ls2) {
    List list = new ArrayList(Arrays.asList(new Object[ls.size()])); 
    Collections.copy(list, ls);
    list.addAll(ls2);// 两个集合的并
    return list;
    }

    public static void cha(List ls, List ls2) {
    ls = bing(ls, ls2);
    List list = new ArrayList(Arrays.asList(new Object[ls.size()])); 
    Collections.copy(list, ls);
    list.removeAll(ls2);// 两个集合的差

    System.out.println("两个集合的差");
    Iterator lit0 = list.listIterator();
    while (lit0.hasNext()) {
    System.out.print("  " + lit0.next());
    }
    }

    }程序做了一些改动,你可以看看
    刚才应该是因为 ls用了多次,导致了结果不对
      

  2.   

     似乎只有两个集合的交集元素持有相同的引用时removeAll才起作用
      

  3.   

    removeAll()传入的set应该是其子集吧
      

  4.   

    4楼的程序我试过了  没错 感谢感谢 让我知道了另外一种实现的方法 
     List list = new ArrayList(Arrays.asList(new Object[ls.size()])); 
    //初始化一个list 它的长度与Object.length一致并且元素初值为空 
    Collections.copy(list, ls);//将ls里的元素复制到list里
    请问这样的分析对吗?
      

  5.   

    不一定非是子集啊  只要两个有交集就可以吧  事实上我那个程序如果单纯只跑removeAll还是没问题的
      

  6.   

    retainAll(Collection<?> c) 
    仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。
    这样操作下来,ls里面的元素其实就都是 ls2里面的元素了,然后再取并,元素也全部是ls2里面的元素,再removeAll(ls2)里面肯定是全部都删除了,空了
      

  7.   

    list和set区别 楼主好好想想实现数学上的集合,应该用Set
      

  8.   

    附带我的源代码:import java.util.Set;
    import java.util.TreeSet;public class SetTest {
    public static void main(String[] args) {
    Set<Integer> ss1 = new TreeSet<Integer>();
    Set<Integer> ss2 = new TreeSet<Integer>();
    ss1.add(0);
    ss1.add(1);
    ss1.add(2);
    ss1.add(3);
    ss1.add(4);
    ss1.add(5);
    ss1.add(6);
    ss1.add(7);
    ss1.add(8);
    ss1.add(9);
    ss1.add(10);
    ss2.add(1);
    ss2.add(3);
    ss2.add(5);
    ss2.add(7);
    ss2.add(9);
    ss2.add(11); System.out.println("第一个集合");// 打印输出第一个集合
    for (Integer s1 : ss1) {
    System.out.print(s1 + ",");
    }
    System.out.println();
    System.out.println("第二个集合");// 打印输出第二个集合
    for (Integer s2 : ss2) {
    System.out.print(s2 + ",");
    }
    System.out.println(); System.out.println("两个集合的交");
    for (Integer s1 : ss1) {
    if (ss2.contains(s1)) {
    System.out.print(s1 + ",");
    }
    }
    System.out.println();
    System.out.println("两个集合的并");
    for (Integer s1 : ss1) {
    System.out.print(s1 + ",");
    }
    for (Integer s2 : ss2) {
    if (!ss1.contains(s2)) {
    System.out.print(s2 + ",");
    }
    }
    System.out.println();
    System.out.println("两个集合的差ss1-ss2");
    for (Integer s1 : ss1) {
    if (!ss2.contains(s1)) {
    System.out.print(s1 + ",");
    }
    }
    System.out.println();
    }
    }
      

  9.   

    恩.......不过这道题的题目要求就是让用list来做,我觉得应该也都能做吧,谢谢你的源码。