通过添加其他列表中的对象从合并列表中删除对象

时间:2014-05-01 17:10:30

标签: java collections arraylist removeall

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

架构:

  1. 我有三个班级 - ClassA,ClassB和ClassC。
  2. ClassA是具有ClassB对象列表的父类。
  3. ClassB是ClassC的父级,并且有一个ClassC对象列表。
  4. ClassC包含一个名为“identifier”的私有变量,其中包含相关的getter / setter。
  5. ClassA有一个API“getClassCList”来获取ClassC对象的综合列表,这些对象包含在ClassA所有的ClassB对象中。
  6. 代码目标:

    1. 使用ClassB实例准备ClassA。使用ClassC实例准备ClassB。
    2. 在ClassA中调用API并获取ClassC实例的综合列表。
    3. 循环执行步骤2中返回的列表,找到具有特定标识符的ClassC实例。需要从列表中删除匹配的对象。
    4. 代码问题:

      1. 当我在“classCList.removeAll(objectsTobeRemoved);”行中的类“Test.java”中调用.removeAll时,代码实际上从ClassA实例的arraylist中删除了对象,这些对象是由ClassA的API“getClassCList”返回的,而不是从ClassB对象中的ClassCList返回的。我如何从ClassB中的ClassC列表中删除ClassC实例?

      2. 更新:我只能访问我可以使用的ClassA实例。

      3. 更新2: ClassA实现了一个名为“IRetrieve”的接口。从ClassA获取ClassC实例的唯一方法是通过“getClassCList”API。我也没办法从ClassA获取ClassB实例。

      4. 代码:

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

classB.getClassCList().removeAll(objectsTobeRemoved);