如何从存储在arraylist中的对象中提取字段?

我可以获得一些可以分开的工作代码示例并研究它们的工作原理吗? 具体来说,我需要弄清楚如何从列表中的x编号对象获取地址字段? 如何从列表中删除第x个对象? 如何将对象x的价格字段设置为新值?

我理解houseList.add如何将数据放入附加到列表末尾的新对象,但我不理解它的反面以及如何定位特定对象并对其进行操作。 请展示一个有效的多类示例。 谢谢!

创建House对象的类,它包含以下信息;

public House(int address, String street, double price, int rooms) { this.address = address; this.street = street; this.price = price; this.rooms = rooms; } 

它有以下方法……

 public void SetAddress (int address){ setAddress(address); } private void setAddress (int address){ this.address = address; } public int GetAddress (int address){ address = getAddress(address); return address; } private int getAddress (int address){ return address; } @Override public String toString() { return address + " " + street + " " + price + " " + rooms; } 

等等…

在另一个类中,我声明了一个名为houseList的House对象列表,它是一个ArrayList。

 List houseList; houseList = new ArrayList(); 

并可以填充数据,

 houseList.add(new House(this.address, this.street, this.price, this.rooms)); 

并迭代它…

  public void showHouses() { Iterator itr = houseList.iterator(); while (itr.hasNext()) { System.out.println(itr.next().toString()); } } 

到目前为止,除了已被覆盖的toString方法之外,我上面列出的所有House方法都没有起作用。 我无法弄清楚的是如何为列表的第x个元素提取this.street或this.price。 我可以使用houseList.add(new House(this.address,this.street,this.price,this.rooms))将数据放入列表中;
我可以看到我的数据在迭代时按预期存储。 我有这些setter和getter,但我不明白如何使用它们来拉出这些项目或设置它们。因为我使用了houseList.add,我认为添加的反面是得到,但没有想出了正确的语法。

修复吸气剂

首先,处理getter / setter。 以下getter:

 private int getAddress (int address){ return address; } 

应修复如下:

 private int getAddress() { return address; } 

在您的代码中, getAddress(int address)方法有一个int参数,并直接返回参数。 它甚至没有查看存储地址值的字段。

迭代列表

你可以改写这个:

 public void showHouses() { Iterator itr = houseList.iterator(); while (itr.hasNext()) { System.out.println(itr.next().toString()); } } 

以更紧凑的方式,使用Java-5样式for循环,如下所示:

 public void showHouses() { for (House house : houseList) { System.out.println(house); // or, say: System.out.println(house.getAddress()); } } 

或者像这样,如果你真的想使用迭代器:

 public void showHouses() { Iterator itr = houseList.iterator(); while (itr.hasNext()) { House house = itr.next(); System.out.println(house); // or, say: System.out.println(house.getAddress()); } } 

请注意,在上面的示例中,通常需要注意每次迭代只调用next() 。 即:将itr.next()分配给局部变量,并使用它,而不是每次迭代多次调用itr.next()

第一种方式的优点是它更短; 并且很明显,你所做的只是迭代集合,而不是以任何方式修改它(尽管你仍然可以修改它的值)。

第二种方法的优点是,当您遍历(迭代)它时,可以调用itr.remove()来从集合中删除元素。

第十三宫

如果你需要第十一宫,你可以写:

 int x = ...; House h = houseList.get(x); System.out.println(h); // or: System.out.println(h.getAddress()); 

编辑:

这是您在代码中有时会看到的另一个遍历列表的模式:

 for (Iterator it = houseList.iterator(); it.hasNext();) { House house = it.next(); // Blah, blah.. } 

这与上面基于迭代器的遍历具有相同的优点。 但是,此版本将迭代器变量( it )的范围限制为循环体。 在上面的版本中,迭代器变量的范围是整个方法体。 因此,更容易看到你从不在循环外使用迭代器。

当您想要在方法(或其他块)中执行多个基于迭代器的遍历时,将范围限制为循环体也很有用。 它还允许您为第二个循环重复使用相同的变量名称(即使第二个循环遍历不同类型的集合)。

itr.next()从列表中返回下一个可用的House对象。 您需要在该house对象上调用方法。

例:

  while (itr.hasNext()) { House hs = itr.next(); System.out.println(hs.getAddress(input)); System.out.println(hs.toString()); }