我需要从ArrayList中删除一些元素。
我使用了removeAll(List)
方法。
但问题是它也删除了重复项。
我如何保留重复项?
请考虑以下示例 -
我有List a1 = {2, 3, 4, 5, 2, 2, 3}
现在我有了另一个
List a2 = {2, 3}
当我使用a1.removeAll(a2)
时,我得到a1 = {4, 5}
这将删除2和3的所有实例。
我需要的是a1 = {4, 5, 2, 2, 3}
只应从a1中删除a2中存在的实例数。
我该怎么做?
答案 0 :(得分:5)
迭代第二个列表,并为第一个列表中的每个成员调用remove()。您无法通过一次通话完成此操作。
一定要调用remove(Object) - 而不是remive(int)!换句话说:确保传递Integer对象。否则,您将调用删除某个索引的错误方法!
答案 1 :(得分:-1)
您可以尝试使用map,因为这可以避免n * m时间复杂度。保持a1&中所有元素的计数。 a2 。然后递减a1计数&根据a1计数地图将其添加到新的Arraylist。
public class Test {
public static void main(String [] args) {
List<Integer> a1 = Arrays.asList(2, 3, 4, 5, 2, 2, 3);
List<Integer> a2= Arrays.asList(2,3);
Map<Integer,Integer> a1Count = new HashMap<>();
Map<Integer,Integer> a2Count = new HashMap<>();
a1.forEach(a -> {
int count = a1Count.get(a)==null ? 0: a1Count.get(a);
a1Count.put(a, count+1);
});
a2.forEach(a -> {
int count = a2Count.get(a)==null ? 0: a2Count.get(a);
a2Count.put(a, count+1);
});
a1Count.forEach((key,value) -> {
if(a2Count.containsKey(key)) {
a1Count.put(key, value-a2Count.get(key));
}
});
List<Integer> removed = new ArrayList<>();
a1Count.forEach((key,value) -> {
if(value>0) {
for(int i= 0; i<value;i++) {
removed.add(key);
}
}
});
System.out.print(removed);
}