从ArrayList中删除元素,同时保留重复项(如果存在)

时间:2017-11-25 05:21:39

标签: java arraylist

我需要从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中存在的实例数。

我该怎么做?

2 个答案:

答案 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);
    }