【问题标题】:Implementer Iterator实现者迭代器
【发布时间】:2020-11-09 15:46:57
【问题描述】:

我目前正在尝试实现 Iterator,它接收一个集合和一个 char 并产生 以该字符开头的字符串。 所以我最终得到了以下(工作)代码:

class A {
public static void main (String [] args) {
    String [] arr = {"abcd","gr","gres","bvg","bb"};
    
    class FirstCharIt implements Iterator<String> {
        char c;
        private Iterator<String> it;
        public FirstCharIt (Collection<String> lst,char c) {
            this.c = c;
            this.it = lst.stream().filter(x->{
                return (x.charAt(0)==this.c);
            }).iterator();
        }
        @Override
        public boolean hasNext() {
            return it.hasNext();
        }

        @Override
        public String next() {
            return it.next();
        }
        
        public Iterator<String> get () {
            return it;
        }
    }
    
    FirstCharIt it1 = new FirstCharIt(Arrays.asList(arr),'b');
    for (it1.get();it1.hasNext();) {
        System.out.println(it1.next());
    }
}

}

虽然这段代码正在运行,但这实际上并不是实现迭代器接口,我什至可以从我的课程标题中删除“实现迭代器”。 当然,get 方法在更多正确实现中并不存在

所以我想对我在这里所做的事情提出一些建议, 谢谢

【问题讨论】:

  • 如果您已经在使用 Streams,则无需实现自己的迭代器类。只需返回一个 stream.map(…).iterator() 实例。
  • “虽然这段代码正在运行,但这实际上并没有实现 Iterator 接口” - 是的。 “我什至可以从我的类标题中删除‘实现迭代器’”——该声明对于实现任何接口的任何类都是正确的,所以我不确定你为什么提到它。
  • @Eran :我的意思是,例如,如果我有参数为 1.List l, 2.Iterator i 的方法,那么如果我将删除 '实现..'部分来自我的课程,它不会通过编译。
  • @AndyTurner,Miha_x64 是的,我明白了。但是有什么方法可以将我的代码更改为正常的 Iterator 类?
  • 你的意思是有for(String nxt: it1){...}也许你想实现Iterable

标签: java iterator


【解决方案1】:

在初始化时过滤输入列表,将过滤后的集合和索引作为迭代器的字段。

hasNext() 检查索引是否已到达过滤集合的末尾,并让next() 增加索引并返回它之前指向的元素。

static class FirstCharIt implements Iterator<String> {
    private int currentIndex;
    private List<String> filtered;
    public FirstCharIt (List<String> coll, char letter) {
        this.filtered = coll.stream().filter(x->x.startsWith(""+letter)).collect(Collectors.toList());
        this.currentIndex = 0;
    }
    
    @Override
    public boolean hasNext() {
        return currentIndex < filtered.size();
    }

    @Override
    public String next() {
        if (!hasNext()) { throw new NoSuchElementException(); }
        return filtered.get(currentIndex++);
    }
}

你可以try it here

【讨论】:

  • 这更接近我想要的。 TY亚伦
猜你喜欢
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 2016-01-23
  • 2012-01-22
  • 2021-11-16
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多