簡體   English   中英

如何從存儲在arraylist中的對象中提取字段?

[英]How to pull a field from an object stored in an 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<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(new House(this.address,this.street,this.price,this.rooms))將數據放入列表中;
我可以看到我的數據在迭代時按預期方式存儲。 我有這些setter和getter,但我不了解如何使用它們將這些項目拉出或放入。由於我使用了houseList.add,所以我發現add的反面是get,但沒有找出正確的語法。

itr.next()返回列表中的下一個可用的House對象。 您需要在該內部對象上調用方法。

例:

 while (itr.hasNext()) {

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

固定吸氣劑

首先,應對吸氣劑/吸氣劑。 以下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家,可以寫:

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 )的范圍限制為循環體。 在上述版本中,迭代器變量的范圍是整個方法主體。 因此,很容易看出您從未在循環外使用迭代器。

當您要在一個方法(或其他塊)中執行多個基於迭代器的遍歷時,將范圍限制在循環主體中也很有用。 它還允許您在第二個循環中重復使用相同的變量名(即使第二個循環遍歷其他類型的集合)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM