1

ArrayList people フィールドを持つクラスを作成します。このクラスのクライアントがそれらのオブジェクトを反復処理できるようにします。どうすればいいですか?people.iterator(); を返すだけですか? ?

たとえば、クライアントでこれを実行できるようにしたい:

for( Person p : people ) {
    // do something
}

これは私のクラスで必要なものですか?

public class People  implements Iterable<Person> {

private ArrayList<Person> people;

@Override
public Iterator<Person> iterator() {
    // TODO Auto-generated method stub
    return people.iterator();
}
4

3 に答える 3

2

イテレータを介してリスト自体を変更したくない場合は、次のiterator()ように変更不可能なリストに委譲します。

public class People implements Iterable<Person> {

    private ArrayList<Person> people;

    @Override
    public Iterator<Person> iterator() {
        return Collections.unmodifiableList(people).iterator();
    }

}

そうでなければ、あなたが持っているものは大丈夫です。

ただし、 が不変でない限り、呼び出し元がオブジェクト自体Personを変更するのを防ぐためにできることは何もないことに注意してください。Personそれでいいなら大したことない。それが問題である場合は、のディープ コピーを作成しpeople、イテレータを返すことができます。

返されたイテレータに s への変更を反映させたいが、Persons の変更は許可しないPerson場合、またはディープ コピーがコストがかかりすぎるか不要な場合は、 aImmutablePersonを拡張PersonしてラップするPersonが、setter による変更を許可しないを作成できます。実際のPersonオブジェクトにラップされたもののリストを返します。

于 2013-08-15T01:23:42.407 に答える
1

はい。拡張 for ループには、配列 または が必要Iterableです。データに関して有用な意味を持つ合理的な反復子を返すIterable必要があります。iterator(

強化された for ループを使用できるようになり、意味的にはある程度正しいものになりました。ただし、イテレータを使用しているすべての人が人物リストから物を削除できるようにしIteratorますremove(が、これは望ましくない場合があります。おそらくnew ArrayList(people).iterator()orを使用Collctions.unmodifiableList(people).iterator()すると、リストをコピーしてイテレータを取得することができます

また、内部の arrayList のコピーまたはそのコピーをgetPeople作成する getter を作成して提供することもできます。ImmutableList

別の注意として、追加の機能が必要な場合は、ArrayList を拡張してみませんか? あなたが何をしているのか正確には見ていないので、推測することしかできません。

于 2013-08-15T01:10:05.843 に答える
0

People リストに getter を提供するだけです。

public ArrayList<Person> get getPeople() {
   return people;
}
于 2013-08-15T01:10:29.397 に答える