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因此旁边的位置:应该是 type 的集合Person

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

您可以选择 aListSet为此并从contacts()class 的方法返回集合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 回答