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

时间:2012-11-19 15:40:13

标签: java arraylist setter getter

我可以获得一些可以分开的工作代码示例并研究它们的工作原理吗? 具体来说,我需要弄清楚如何从列表中的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,我认为添加的反面是获取,但没有想出了正确的语法。

2 个答案:

答案 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)的范围限制为循环体。在上面的版本中,迭代器变量的范围是整个方法体。因此,更容易看到你从不在循环外使用迭代器。

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