62,614
社区成员
发帖
与我相关
我的任务
分享
public static void main(String[] args) {
int max_len = 50000;
ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<Integer> list2 = new ArrayList<Integer>();
for (int i=0; i<max_len; i++) {
list1.add((int)(Math.random()*max_len));
list2.add((max_len/2)+(int)(Math.random()*max_len));
}
System.out.printf("list1:%d, list2:%d\n", list1.size(), list2.size());
long start = System.currentTimeMillis();
HashSet<Integer> set_all = new HashSet<Integer>();
for (int i=0; i<list1.size(); i++) {
set_all.add(list1.get(i));
}
HashSet<Integer> set_dup = new HashSet<Integer>();
ArrayList<Integer> list2_clean = new ArrayList<Integer>();
for (int i=0; i<list2.size(); i++) {
if (set_all.add(list2.get(i))) { //in list2 but not in list1
list2_clean.add(list2.get(i));
} else {
set_dup.add(list2.get(i)); //in list2 and also in list1
}
}
ArrayList<Integer> list1_clean = new ArrayList<Integer>();
for (int i=0; i<list1.size(); i++) {
if (set_dup.add(list1.get(i))) { //in list1 but not in the duplicated set
list1_clean.add(list1.get(i));
}
}
long end = System.currentTimeMillis();
System.out.printf("list1 clean:%d, list2 clean:%d\n", list1_clean.size(), list2_clean.size());
System.out.printf("time spent : %dms\n", end-start);
}
public boolean removeAll(Collection<?> c) {
boolean modified = false;
Iterator<?> e = iterator();
while (e.hasNext()) {
if (c.contains(e.next())) {
e.remove();
modified = true;
}
}
return modified;
}
ArrayList和LinkedList都继承了AbstractCollection,没有覆盖removeAll方法。
HashSet的父类AbstractSet有覆盖removeAll方法,不过思路好像也差不多。