您好我是Java的新手,我在作业中遇到了以下问题。我需要编写一个类,在调用void方法时添加一个新对象列表。作为提示,给出了迭代器方法的结构,因此我的代码的核心结构现在看起来像这样:
public class objectList implements Iterable<Obj> {
private ArrayList<Obj> objectList;
attribute_a A;
attribute_b B;
attribute_c C;
public objectList(attribute_a A, attribute_b B, attribute_c C){
objectList = new ArrayList<Obj>;
this.A = A;
this.B = B;
this.C = C;
}
public void extendList(attribute_a A, attribute_b B, attribute_c C){
objectList.add(new Obj(A,B,C));
}
public Iterator<Obj> iterator(){
return objectList.iterator();
}
@Override
public String toString(){
newstr = "";
for(i = 0;i<objectList.size();i++)
{
//Assuming Obj has the method toString()
//It prints out all details of each object, then join into one string
newstr += objectList.get(i).toString();
}
return newstr;
}
}
我被告知只使用java.util.iterator而不是自定义迭代器 - 所以它使我免于定义HasNext(),next(),remove()等。
编辑:我的目标是能够在多次调用extendList()之后打印存储在objectList中的对象,即列表中存储了许多项目。现在我只能打印其中的最新项目(列表中只有1项)。
我需要做些什么来制作&#34;光标&#34;自动指向下一个项目 - &gt;获取属性 - &gt;在属性上执行任务 - &gt;下一个项目等,直到列表完成?
答案 0 :(得分:1)
让我们看看这里发生了什么......
所以,你有一个类,它有一个名为objectList
的字段。创建new objectList
实例时,将调用构造函数并将该字段初始化为空列表。到现在为止还挺好。 (但是,为什么你有一个名为A
,B
和C
的字段?它们似乎根本不被使用,因此要求有人传递三个参数似乎很困惑你的构造函数被有效忽略。)
然后,每当调用extendList
时,新的Obj
都会添加到实例的列表中。这看起来是正确的。这意味着在任何给定点,我们可以说objectList
的大小等于在该对象上调用extendList
的次数。
同样,调用iterator
只会返回此列表的标准Java迭代器。因此,迭代器应该访问该列表中的每个Obj
,这将是一些项目,其数量等于在同一extendList
个对象上调用objectList
的次数。
那么 - 为什么它不起作用?
从您发布的代码中不清楚。你的班级本身看起来还不错,所以结论是你必须把它称错。我的 guess 是你实际构建了类的多个实例 - 每次调用构造函数时,都会创建一个包含不同字段的新实例。例如,这不符合您的期望:
new objectList().extendList("A1", "B1", "C1");
new objectList().extendList("A2", "B2", "C2");
new objectList().extendList("A3", "B3", "C3");
return new objectList().iterator();
因为每次都会创建一个新实例,从而有效地将状态从之前抛出。你想把它重写为:
objectList ol = new objectList();
ol.extendList("A1", "B1", "C1");
ol.extendList("A2", "B2", "C2");
ol.extendList("A3", "B3", "C3");
return ol.iterator();
如果这不能解决问题,请查看您如何使用该类,计算在从获取迭代器的同一实例上调用extendList
的次数。如果有疑问 - 让Java为你计算 - 添加System.out.println("in extendList")
调用(可能还有一些在构造函数中)以查看何时被调用。实际上,如果担心使用类的不同实例,则可以使用System.identityHashcode()
获取特定实例的唯一标识符,例如:
public void extendList(attribute_a A, attribute_b B, attribute_c C){
System.out.println("Extending list for " + System.identityHashcode() + " with " + A + ", " + B + ", " + C);
objectList.add(new Obj(A,B,C));
}
如果不这样做,可能值得熟悉如何使用调试器,并逐行逐步执行程序。这将让您在每一步都能看到您的计划的状态,并希望它能让您清楚地知道哪些事情与您的期望有所不同。
(我还鼓励你使用标准的Java命名约定,因为你的代码目前在没有它们的情况下阅读是非常具有挑战性的。类名应该以大写字母开头(并且在UpperCamelCase中)。变量和字段名称应该开始小写字母(并且在lowerCamelCase中)。目前你的类名看起来像一个变量,你的字段看起来像通用参数。new objectList()
只是看起来不对!)
答案 1 :(得分:0)
尝试在构造函数中初始化此objectList = new ArrayList<Obj>;
,
private ArrayList<Obj> objectList=new ArrayList<Obj>();