繁体   English   中英

Java实现Iterable,针对每个和方法

[英]Java implement Iterable, for each and method

我在本练习中使用了要实现的算法。 我有这个主要的:

    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!!

}

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

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

所以现在下面的工作了...

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM