Java 从ArrayList中删除元素,同时保留副本(如果有)

Java 从ArrayList中删除元素,同时保留副本(如果有),java,arraylist,Java,Arraylist,我需要从ArrayList中删除一些元素。 我使用了removeAllList方法。 但问题是它也会删除重复项。 如何保留副本 考虑下面的例子- 我有一个列表a1={2,3,4,5,2,2,3} 现在我有另一个 List a2 = {2, 3} 当我使用a1.removeAlla2时,我得到a1={4,5} 这将删除2和3的所有实例 我需要的是a1={4,5,2,2,3} 仅a2中存在的实例数应从a1中删除 我该怎么做 迭代第二个列表,并为每个成员调用第一个列表上的remove。你不能一个电话

我需要从ArrayList中删除一些元素。 我使用了removeAllList方法。 但问题是它也会删除重复项。 如何保留副本

考虑下面的例子-

我有一个列表a1={2,3,4,5,2,2,3}

现在我有另一个

List a2 = {2, 3}
当我使用a1.removeAlla2时,我得到a1={4,5} 这将删除2和3的所有实例

我需要的是a1={4,5,2,2,3} 仅a2中存在的实例数应从a1中删除


我该怎么做

迭代第二个列表,并为每个成员调用第一个列表上的remove。你不能一个电话就做到这一点


并且一定要调用removeObject,而不是Remivent!换句话说:确保传递整数对象。否则,您将调用错误的方法来删除某个索引

迭代第二个列表,并为每个成员调用第一个列表上的remove。你不能一个电话就做到这一点


并且一定要调用removeObject,而不是Remivent!换句话说:确保传递整数对象。否则,您将调用错误的方法来删除某个索引

您可以尝试使用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);
    }

您可以尝试使用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);
    }

你的问题不完整。a2中有2个项目,仅当它们在a1中的顺序与a2中的顺序相同时,才要删除它们。如果a1是{3,4,5,2,2,3}并且a2={2,3},会发生什么?最终结果是{4,5,2,3}吗?除非您没有澄清这些问题,否则没有人可以编写符合您要求的代码。a2是否可以包含重复的代码?因此,请向我们展示您编写的代码,并解释哪些代码不适合您。请访问并阅读以了解如何使用此网站。您的问题不完整。a2中有2个项目,仅当它们在a1中的顺序与a2中的顺序相同时,才要删除它们。如果a1是{3,4,5,2,2,3}并且a2={2,3},会发生什么?最终结果是{4,5,2,3}吗?除非您没有澄清这些问题,否则没有人可以编写符合您要求的代码。a2是否可以包含重复的代码?因此,请向我们展示您编写的代码,并解释哪些代码不适合您。请访问并阅读以了解如何使用此网站。Nice。回答一个无代码的问题,告诉我如何用算法而不是代码来回答这个问题。投赞成票,很好。回答一个无代码的问题,告诉我如何用算法而不是代码来回答这个问题。投票表决。