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

Posted

技术标签:

【中文标题】Java实现Iterable,对于每个和方法【英文标题】:Java implement Iterable, for each and method 【发布时间】:2012-08-21 05:03:03 【问题描述】:

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

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


【问题讨论】:

很难理解你想要什么。就像现在描述的问题一样,即使是一个简单的 getter 也可以。 public Set&lt;Person&gt; contacts() return friends; 。它只会返回朋友集,并将使用它的 (Set's) 迭代器。不知道这是否是你想要的。 P.S.如果name 从未更改(仅在构造函数中分配值),通常将其声明为final 是一个好习惯。 (这与您的问题没有任何关系,只是一个提示)。 【参考方案1】:

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

public Set<Person> contacts() 
    return friends;

所以现在下面将工作......

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

【讨论】:

【参考方案2】:

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

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

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

在这种情况下,因为你有 Set 所以返回它。

public Set<Person> contacts() 
    return friends;

【讨论】:

为什么不隐藏实现细节并返回Collection&lt;Person&gt;呢? 有道理...但是由于 OP 对返回的内容感到困惑...我想保持简单!!【参考方案3】:

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

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

【讨论】:

以上是关于Java实现Iterable,对于每个和方法的主要内容,如果未能解决你的问题,请参考以下文章

请问java中的Iterator和Iterable有些啥区别啊?

总结java集合

java中自己实现一个可以用foreach循环的类 Iterable,Iterator

Java中的反射机制

对于不实现 Iterable 的类,如何使用 for-each 循环

迭代器模式