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

Java实现Iterable,用于每个和方法,java,collections,foreach,iterator,iterable,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(P

我有一个算法来实现这个练习。我有一个主要问题:

    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实现Iterable{
private Set friends=new HashSet();
私有字符串名称;
公众人物(字符串名称){
this.name=名称;
}
公众朋友(o人){
加上(o);
}
公共字符串toString(){
返回此.name;
}
@凌驾
公共迭代器迭代器(){
迭代器i=friends.Iterator();
返回i;
}
//这里是联系人方法的实现!!
}
让您的
联系人()
方法的返回类型为
个人集

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

由于您希望为
人员
运行循环,因此
旁边的位置:
应该是
人员
类型的集合

    for(Person p: a.contacts())
        System.out.println(p);
您可以为此选择一个
列表
设置
,并从类
个人
联系人()返回集合

在本例中,由于您已经设置了
,所以返回它

public Set<Person> contacts() {
    return friends;
}
公共设置联系人(){
回报朋友;
}

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

public Iterable<Person> contacts() {
  return new Iterable<Person>() {
    public Iterator<Person> iterator() {
      return friends.iterator();
    }
  };
}
public-Iterable联系人(){
返回新的Iterable(){
公共迭代器迭代器(){
return friends.iterator();
}
};
}

很难理解您想要什么。即使是一个简单的getter也会像现在描述的问题一样<代码>公共设置联系人(){return friends;}
。它将只返回friends集合,并将使用其(集合的)迭代器。不知道这是不是你想要的。如果
名称
从未更改(值仅在构造函数中分配),通常最好将其声明为
最终
。(这与您的问题没有任何关系,只是一个提示)。为什么不隐藏实现细节并返回一个
集合
。。。但是由于OP对返回的内容感到困惑。。。我想保持简单!!
public Set<Person> contacts() {
    return friends;
}
public Iterable<Person> contacts() {
  return new Iterable<Person>() {
    public Iterator<Person> iterator() {
      return friends.iterator();
    }
  };
}