2

この演習では、実装するアルゴリズムを使用しました。私はこのメインを持っています:

    public static void main(String[] args) {
        Person a = new Person("Tony");
        Person c = new Person("Luke");
        Person o = new Person("Ann");

        a.addFriends(c);
        a.addFriends(o);

        for(Person p: a.contacts())
            System.out.println(p);
}

「a.contacts()」を「a」に置き換えてこのクラスを使用すると、コードは機能します。しかし、「a.contacts()」を使用してfor-eachループを実装するにはどうすればよいですか?ありがとう

class Person implements Iterable<Person> {

    private Set<Person> friends = new HashSet<Person>();   
    private String name;

    public Person(String name){
        this.name = name;
    }

    public void addFriends(Person o){                
        friends.add(o);
   }

    public String toString(){
        return this.name;
    }


    @Override
    public Iterator<Person> iterator() {
        Iterator<Person> i = friends.iterator();
        return i;
    }

    //Here the contacts method to implement!!

}
4

3 に答える 3

1

メソッドcontacts()の戻り型をSet of Person...とします。

public Set<Person> contacts() {
    return friends;
}

だから今、以下が機能します...

for (Person p : a.contacts()) {
    System.out.println(p);
}
于 2012-08-26T11:13:53.017 に答える
0

のループを実行したいPersonので、隣の場所:はタイプのコレクションである必要がありますPerson

    for(Person p: a.contacts())
        System.out.println(p);

Listこれに対してまたはを選択して、クラスのメソッドSetからコレクションを返すことができます。contacts()Person

この場合、あなたはそれを持っているSetのでそれを返します。

public Set<Person> contacts() {
    return friends;
}
于 2012-08-26T11:29:10.657 に答える
0

Collection <T>でこれを行うことは、Iterable<T>を使用することと同じではありません。Iterable <T>の実装では遅延読み込みが可能ですが、Collection <T>ベースの実装では、コレクションを返す前にコレクション全体を埋める必要があります。要件に対処する正しい方法は、クラス `Person´内に次のメソッドを実装することです。

public Iterable<Person> contacts() {
  return new Iterable<Person>() {
    public Iterator<Person> iterator() {
      return friends.iterator();
    }
  };
}
于 2012-08-26T11:30:25.837 に答える