1

分解してどのように動作するかを調べることができる実用的なコード例を入手できますか? 具体的には、リスト内の 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 という名前のハウス オブジェクトのリストを宣言し、それが 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)); を使用してリストにデータを配置できます。
繰り返し実行すると、データが期待どおりに保存されていることがわかります。私はこれらのセッターとゲッターを持っていますが、これらのアイテムを引き出したり、セットしたりするためにそれらを使用する方法を理解していません。正しい構文を見つけました。

4

2 に答える 2

4

itr.next()リストから次に利用可能な House オブジェクトを返します。そのハウス オブジェクトのメソッドを呼び出す必要があります。

例:

 while (itr.hasNext()) {

        House hs = itr.next();
        System.out.println(hs.getAddress(input));
        System.out.println(hs.toString());
    }
于 2012-11-19T15:42:17.020 に答える
3

ゲッターの修正

まず、ゲッター/セッターに対処します。次のゲッター:

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());
    }
}

よりコンパクトな方法で、次のforようなJava-5スタイルのループを使用します。

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()反復ごとに1回だけ呼び出すように注意する必要があることに注意してください。つまり、反復ごとに複数回itr.next()呼び出すのではなく、ローカル変数に割り当ててそれを使用します。itr.next()

最初の方法の利点は、それが短いことです。また、コレクションを反復処理するだけで、コレクションを変更しないことは明らかです(ただし、コレクションの値は変更できます)。

itr.remove()2番目の方法の利点は、コレクションをトラバース(反復)するときに、コレクションから要素を削除するために呼び出すことができることです。

x番目の家

x番目の家が必要な場合は、次のように書くことができます。

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

編集:

リストをトラバースするコードに時々見られるもう1つのパターンを次に示します。

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

これには、上記のイテレータベースのトラバーサルと同じ利点があります。ただし、このバージョンでは、イテレータ変数(it)のスコープがループ本体に制限されています。上記のバージョンでは、イテレータ変数のスコープはメソッド本体全体です。したがって、ループの外側でイテレータを使用しないことがわかりやすくなります。

スコープをループ本体に制限することは、メソッド(または他のブロック)で複数のイテレーターベースのトラバーサルを実行する場合にも役立ちます。また、2番目のループに同じ変数名を再利用することもできます(2番目のループが異なるタイプのコレクションを繰り返し処理する場合でも)。

于 2012-11-19T15:50:04.703 に答える