如何返回带有函数的Iterable?

时间:2019-05-22 00:08:43

标签: java return iterable

我有一些包含姓名和年龄的对象。然后,我建立了一个包含这些对象的哈希表。我为此哈希表编写了自己的接口,称为PeopleIterator和PeopleIterable以及Iteratorimplementation。一切都很好。

现在,我必须在该哈希表类中编写一个函数,该函数返回另一个名为StringIterable的接口,其中包含所有人民的姓名。

如果需要,我可以使用Collections Framework和helper类中的数据结构,但我什至不知道如何开始。

public class PeopleHashtable implements PeopleIterable{
    private People[] people;

    public StringIterable copyNames() {

    }
}


public interface StringIterable extends java.lang.Iterable<String> {
    StringIterator iterator();
}

3 个答案:

答案 0 :(得分:0)

set和list是可迭代的。所以也许只返回诸如map.keySet()之类的东西。

相关:Arrays, lists, sets and maps are iterable. What else?

答案 1 :(得分:0)

通过提供next()hasNext()的实现来实现Iterator接口。

如果您还有另一个要返回的元素,则

hasNext()只会返回true或false。就像检查当前数组索引到数组长度一样简单。

next()只是返回该索引处的元素并递增索引。

这是示例模板。

class MyClass implements Iterator<String> {
   String[] foo ...;
   private int index;
   public Iterator<String> iterator() {
      index = 0;
      return this;
   }

   public boolean hasNext() {
      //your code
   }

   public String next() {
      //your code
   }
}

答案 2 :(得分:0)

我认为您误解了这些要求。我认为copyNames实际上应该返回Iterator<String>而不是IterableIterable是您调用iterator()才能获得Iterator的东西。

我也同意约翰·克鲁格曼的评论是正确的。建议不要声明自定义接口,例如PeopleIterableStringIterable。他们无济于事。

无论如何,这是copyNames(方法名称的错误选择!)的简洁实现,假设它返回的是Iterator而不是Iterable

public Iterator<String> copyNames() {
    return Arrays.stream(people).map(p -> p.getName()).iterator();
}

如果您确实需要Iterable...。

public Iterable<String> copyNames() {
    return new Iterable<String>() {
        public Iterator<String> iterator() {
            return Arrays.stream(people).map(p -> p.getName()).iterator();
        }
    }
}