【发布时间】:2014-06-18 05:26:03
【问题描述】:
我正在尝试编写代码以从 ArrayList 实例中删除某些对象。
架构:
- 我有三个班级 - ClassA、ClassB 和 ClassC。
- ClassA 是具有 ClassB 对象列表的父类。
- ClassB 是 ClassC 的父级,并且有一个 ClassC 对象列表。
- ClassC 包含一个名为“标识符”的私有变量,以及关联的 getter/setter。
- ClassA 有一个 API“getClassCList”来获取 ClassC 对象的综合列表,这些对象包含在 ClassA 拥有的所有 ClassB 对象中。
代码目标:
- 使用 ClassB 的实例准备 ClassA。使用 ClassC 的实例准备 ClassB。
- 调用 ClassA 中的 API 并获取 ClassC 实例的综合列表。
- 遍历步骤 2 中返回的列表,找到具有特定标识符的 ClassC 实例。匹配的对象需要从列表中删除。
代码问题:
当我在“classCList.removeAll(objectsTobeRemoved);”行调用“Test.java”类中的 .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);
}
}
【问题讨论】:
标签: java collections arraylist removeall