Java实现Iterable,适用于每个方法

时间:2012-08-26 11:08:53

标签: java collections foreach iterator iterable

我使用算法实现此练习。我有这个主要的:

    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”替换“a.contacts()”并使用此类,则代码可以正常工作!但是如何用“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!!

}

3 个答案:

答案 0 :(得分:1)

让您的contacts()方法的返回类型为Set of Person ....

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

现在,以下内容将有效......

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

答案 1 :(得分:0)

由于您要为Person运行循环,因此:旁边的位置应为Person类型的集合。

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

您可以为此选择ListSet,然后从contacts()类的Person方法返回该集合。

在这种情况下,因为您已经Set所以请将其返回。

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

答案 2 :(得分:0)

使用Collection&lt; T&gt;执行此操作与使用Iterable&lt; T&gt;不同。 Iterable&lt; T&gt;的实现允许延迟加载而Collection&lt; T&gt;基于实现要求您在返回之前填充整个集合。处理您的需求的正确方法是在“Person”类中实现以下方法:

public Iterable<Person> contacts() {
  return new Iterable<Person>() {
    public Iterator<Person> iterator() {
      return friends.iterator();
    }
  };
}