我可以获得一些可以分开的工作代码示例并研究它们的工作原理吗? 具体来说,我需要弄清楚如何从列表中的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<House> houseList;
houseList = new ArrayList();
并且可以用数据填充
houseList.add(new House(this.address, this.street, this.price, this.rooms));
并迭代它......
public void showHouses() {
Iterator<House> itr = houseList.iterator();
while (itr.hasNext()) {
System.out.println(itr.next().toString());
}
}
到目前为止,除了已被覆盖的toString方法之外,我上面列出的所有House方法都没有发挥作用。我无法弄清楚的是如何为列表的第x个元素提取this.street或this.price。我可以将数据放入列表中
houseList.add(新房子(this.address,this.street,this.price,this.rooms));
我可以看到我的数据在迭代时按预期存储。我有这些setter和getters,但我不明白如何使用它们来拉出这些项目或将它们设置进去。因为我使用了houseList.add,我认为添加的反面是获取,但没有想出了正确的语法。
答案 0 :(得分:4)
itr.next()
从列表中返回下一个可用的House对象。你需要调用那个house对象的方法。
示例:
while (itr.hasNext()) {
House hs = itr.next();
System.out.println(hs.getAddress(input));
System.out.println(hs.toString());
}
答案 1 :(得分:2)
修复getter
首先,处理getter / setter。以下getter:
private int getAddress (int address){
return address;
}
应修复如下:
private int getAddress() {
return address;
}
在您的代码中,您的getAddress(int address)
方法有一个int参数,并直接返回该参数。它甚至没有查看存储地址值的字段。
迭代列表
你可以改写:
public void showHouses() {
Iterator<House> 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<House> 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()
从集合中删除元素。
第x家
如果你需要第x家,你可以写:
int x = ...;
House h = houseList.get(x);
System.out.println(h);
// or: System.out.println(h.getAddress());
修改强>
这是您在代码中有时会看到的另一个遍历列表的模式:
for (Iterator<House> it = houseList.iterator(); it.hasNext();) {
House house = it.next();
// Blah, blah..
}
这与上面基于迭代器的遍历具有相同的优点。但是,此版本将迭代器变量(it
)的范围限制为循环体。在上面的版本中,迭代器变量的范围是整个方法体。因此,更容易看到你从不在循环外使用迭代器。
当您希望在方法(或其他块)中执行多个基于迭代器的遍历时,将范围限制为循环体也很有用。它还允许您为第二个循环重复使用相同的变量名称(即使第二个循环遍历不同类型的集合)。