迭代器如何与构造函数一起使用

时间:2014-04-14 08:37:44

标签: java object iterator

您好我是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;下一个项目等,直到列表完成?

2 个答案:

答案 0 :(得分:1)

让我们看看这里发生了什么......

所以,你有一个类,它有一个名为objectList的字段。创建new objectList实例时,将调用构造函数并将该字段初始化为空列表。到现在为止还挺好。 (但是,为什么你有一个名为ABC的字段?它们似乎根本不被使用,因此要求有人传递三个参数似乎很困惑你的构造函数被有效忽略。)

然后,每当调用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>();