我正在尝试编写代码以从ArrayList实例中删除某些对象。

建筑:


我有三个类-ClassA,ClassB和ClassC。
ClassA是具有ClassB对象列表的父类。
ClassB是ClassC的父级,并且具有ClassC对象的列表。
ClassC包含一个称为“标识符”的私有变量,具有关联的获取器/设置器。
ClassA具有API“ getClassCList”以获取ClassC对象的合并列表,这些列表包含在ClassA具有的所有ClassB对象内。


代码目标:


用ClassB实例准备ClassA。使用ClassC实例准备ClassB。
调用ClassA中的API并获取ClassC实例的合并列表。
循环遍历步骤2中返回的列表,并找到具有特定标识符的ClassC实例。匹配的对象需要从列表中删除。


代码有问题:


当我在类“ Test.java”中的“ classCList.removeAll(objectsTobeRemoved);”行中调用.removeAll时,代码实际上从ClassA的API“ getClassCList”返回的ClassC实例的数组列表中除去对象,而不是从ClassB对象中存在的ClassCList中除去对象。如何从ClassB的ClassC列表中删除ClassC实例?
更新:我只能访问我可以使用的ClassA实例。
更新2:ClassA实现了一个称为“ IRetrieve”的接口。从ClassA获取ClassC实例的唯一可用方法是通过“ getClassCList” API。我也没有办法从ClassA获取ClassB实例。


码:

 public interface IRetrieve {

        List<ClassC> getClassCList();

    }

    public class ClassA implements IRetrieve {

        private List<ClassB> classBList;

        public List<ClassB> getClassBList() {
            return classBList;
        }

        public void setClassBList(List<ClassB> classBList) {
            this.classBList = classBList;
        }

        public List<ClassC> getClassCList(){

            List<ClassC> classCList = new ArrayList<>();

            for(ClassB classB: classBList){
                classCList.addAll(classB.getClassCList());
            }

            return classCList;
        }
    }

    public class ClassB {

        private List<ClassC> classCList;

        public List<ClassC> getClassCList() {
            return classCList;
        }

        public void setClassCList(List<ClassC> classCList) {
            this.classCList = classCList;
        }
    }


    public class ClassC {

        private String identifier;

        public String getIdentifier() {
            return identifier;
        }

        public void setIdentifier(String identifier) {
            this.identifier = identifier;
        }
    }

    public class Test {
    public static void main(String[] args) {
        ClassA classA = new ClassA();
        classA.setClassBList(new ArrayList<ClassB>());
        for (int i = 0; i < 5; i++) {
            ClassB classB = new ClassB();
            classB.setClassCList(new ArrayList<ClassC>());
            for (int j = 0; j < 5; j++) {
                ClassC classC = new ClassC();
                classB.getClassCList().add(classC);
            }
            classA.getClassBList().add(classB);
        }

        removeClassCInstances(classA);
    }


    public static void removeClassCInstances(IRetrieve classA){

        //try removing a specific object from the ClassCList
        //using an instance of ClassA

        List<ClassC> classCList = classA.getClassCList();

        List<ClassC> objectsTobeRemoved = new ArrayList<>();

        for(ClassC classC : classCList){
            if(classC.getIdentifier().equals("1")){
                objectsTobeRemoved.add(classC);
            }
        }

        classCList.removeAll(objectsTobeRemoved);
    }
}

最佳答案

您可以定义API来删除ClassA中的对象:

public class ClassA {
   ...
   public void removeAll(List<ClassC> objectsToRemove) {
       for(ClassB classB: classBList){
           classB.getClassCList().removeAll(objectsToRemove);
       }
   }
}

09-13 05:27