【问题标题】:Removing objects from a list consolidated by adding objects from other lists从通过添加其他列表中的对象合并的列表中删除对象
【发布时间】:2014-06-18 05:26:03
【问题描述】:

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

架构:

  1. 我有三个班级 - ClassA、ClassB 和 ClassC。
  2. ClassA 是具有 ClassB 对象列表的父类。
  3. ClassB 是 ClassC 的父级,并且有一个 ClassC 对象列表。
  4. ClassC 包含一个名为“标识符”的私有变量,以及关联的 getter/setter。
  5. ClassA 有一个 API“getClassCList”来获取 ClassC 对象的综合列表,这些对象包含在 ClassA 拥有的所有 ClassB 对象中。

代码目标:

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

代码问题:

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

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

  3. 更新 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);
    }
}

【问题讨论】:

    标签: java collections arraylist removeall


    【解决方案1】:

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

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

    【讨论】:

    • 我个人喜欢这种处理删除的方式,我也考虑过这个解决方案。唯一的缺点是我可能需要遍历 ClassA 中的所有 ClassB 实例以删除 ClassC 实例。从性能的角度来看,有没有更好的方法?
    • 更改类中的数据组成
    • 谢谢!由于这些类以这种方式设计以满足我的应用程序中的其他需求,因此更改组合对我来说不是一个可行的选择。但是定义一个新的 API 来循环 ClassB 对象并删除匹配的 ClassC 实例对我来说听起来像是一个很好的解决方案。接受这个答案。
    【解决方案2】:
    classB.getClassCList().removeAll(objectsTobeRemoved);
    

    【讨论】:

    • 我可以访问 ClassA 的实例,而不是对包含匹配对象的 ClassB 的直接引用。我已经用这个更新了我的问题。
    • 你应该提供一个简短的解释以及代码以获得更好的答案。
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    相关资源
    最近更新 更多