Java 通过从其他列表中添加对象从列表中删除对象

Java 通过从其他列表中添加对象从列表中删除对象,java,collections,arraylist,removeall,Java,Collections,Arraylist,Removeall,我正试图编写一段代码,从ArrayList实例中删除某些对象 体系结构: public interface IRetrieve { List<ClassC> getClassCList(); } public class ClassA implements IRetrieve { private List<ClassB> classBList; public List<ClassB>

我正试图编写一段代码,从ArrayList实例中删除某些对象

体系结构:

 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);
    }
}
  • 我有三个班——A班、B班和C班
  • ClassA是具有ClassB对象列表的父类
  • ClassB是ClassC的父级,并且有一个ClassC对象列表
  • ClassC包含一个名为“identifier”的私有变量,该变量带有相关的getter/setter
  • ClassA有一个API“getClassCList”来获取ClassC对象的合并列表,这些对象包含在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);
        }
    }
    
  • 用ClassB的实例准备ClassA。用ClassC的实例准备ClassB
  • 在ClassA中调用API并获得ClassC实例的合并列表
  • 在步骤2中返回的列表上循环,并查找具有特定标识符的ClassC实例。需要从列表中删除匹配的对象
  • 代码问题:

     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);
        }
    }
    
  • 当我在“classCList.removeAll(objectsTobeRemoved);”行调用类“Test.java”中的.removeAll时,代码实际上从ClassC实例的arraylist中删除了对象,该arraylist由ClassA的API“getClassCList”返回,而不是从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);
        }
    }
    
    公共接口IRetrieve{
    列出getClassCList();
    }
    公共类ClassA实现了IRetrieve{
    私有列表类列表;
    公共列表getClassBList(){
    返回类列表;
    }
    公共无效设置类列表(列表类列表){
    this.classBList=classBList;
    }
    公共列表getClassCList(){
    List classCList=new ArrayList();
    for(ClassB ClassB:classBList){
    addAll(classB.getClassCList());
    }
    返回classCList;
    }
    }
    公共B类{
    私有列表类clist;
    公共列表getClassCList(){
    返回classCList;
    }
    公共无效setClassCList(列表classCList){
    this.classCList=classCList;
    }
    }
    公共类C类{
    私有字符串标识符;
    公共字符串getIdentifier(){
    返回标识符;
    }
    公共无效集合标识符(字符串标识符){
    this.identifier=标识符;
    }
    }
    公开课考试{
    公共静态void main(字符串[]args){
    ClassA ClassA=新的ClassA();
    setClassBList(新的ArrayList());
    对于(int i=0;i<5;i++){
    ClassB ClassB=新的ClassB();
    setClassCList(newArrayList());
    对于(int j=0;j<5;j++){
    ClassC ClassC=新的ClassC();
    getClassCList().add(classC);
    }
    classA.getClassBList().add(classB);
    }
    移除类别(A类);
    }
    公共静态void removeClassInstances(IRetrieve classA){
    //尝试从ClassCList中删除特定对象
    //使用ClassA的实例
    List classCList=classA.getClassCList();
    List 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);
           }
       }
    }
    
    公共类ClassA{
    ...
    public void removeAll(列表objectsToRemove){
    for(ClassB ClassB:classBList){
    getClassCList().removeAll(objectsToRemove);
    }
    }
    }
    
    我可以访问ClassA的实例,但不能直接引用包含匹配对象的ClassB。我已经用这个更新了我的问题。你应该提供一个简短的解释以及更好的答案的代码。我个人喜欢这种处理删除的方式,我也考虑过这个解决方案。唯一的缺点是,我可能需要迭代ClassA中的所有ClassB实例来删除ClassC实例。从性能的角度来看,有没有更好的方法?更改类中数据的组成谢谢!由于这些类是以这种方式设计的,以满足我的应用程序中的其他需求,因此更改组合对我来说不是一个可行的选择。但是定义一个新的API来循环ClassB对象并删除匹配的ClassC实例对我来说是一个很好的解决方案。接受这个答案。