嗨,我是 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 项)。
我需要做什么才能使“光标”自动指向下一个项目 -> 获取属性 -> 对属性执行任务 -> 下一个项目等,直到列表完成?
最佳答案
让我们看看这里发生了什么......
因此,您有一个类,它有一个名为 objectList
的字段。当您创建一个新的 objectList 实例时,构造函数将被调用,并且该字段将被初始化为空列表。到目前为止,一切都很好。 (但是,为什么会有名为 A
、B
和 C
的字段?它们似乎根本没有被使用,所以它要求某人将三个被有效忽略的参数传递给构造函数似乎令人困惑。)
然后,每当调用 extendList
时,都会将新的 Obj
添加到实例的列表中。看起来差不多是这样。这意味着在任何给定点,我们都可以说 objectList
的大小等于对该对象调用 extendList
的次数。
同样,调用 iterator
将仅返回此列表的标准 Java 迭代器。因此,迭代器应该访问该列表中的每个 Obj
,其中项目的数量等于在同一 objectList< 上调用
extendList
的次数。/code> 对象。
那么 - 为什么它不起作用?
从您发布的代码中尚不清楚。你的类本身看起来不错,所以结论是你一定是调用错误了。我的猜测是,您实际上正在构造该类的多个实例 - 每次调用构造函数时,您都会创建一个具有不同字段的新实例。例如,这不会达到您的预期:
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("inextendList") 调用(也许还有构造函数中的一些调用)以查看何时调用什么。事实上,如果担心使用该类的不同实例,您可以使用 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 命名约定,因为如果没有它们,您的代码目前很难阅读。类名应以大写字母开头(并采用大驼峰式命名)。变量和字段名称应以大写字母开头使用小写字母(并且采用小驼峰命名法)。此时,您的类名看起来像一个变量,而您的字段看起来像泛型参数。new objectList()
看起来就是错误的!)
关于java - 迭代器如何与构造函数一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23055559/