在同一类中实现Java Iterator和Iterable?

| 我试图了解Java
Iterator
Iterable
接口 我正在写这堂课
class MyClass implements Iterable<String> {
    public String[] a = null;
    public MyClass(String[] arr) {
        a = arr;    
    }

    public MyClassIterator iterator() {
        return new MyClassIterator(this);
    }

    public class MyClassIterator implements Iterator<String> {
        private MyClass myclass = null;
        private int count = 0;
        public MyClassIterator(MyClass m) {
            myclass = m;    
        }

        public boolean hasNext() {
            return count < myclass.a.length;
        }
        public String next() {
            int t = count;
            count++;
            return myclass.a[t];
        }

        public void remove() {
            throw new UnsupportedOperationException();
        }
    }   
}
它似乎正在工作。 我应该有:
Myclass implements Iterable<Stirng>, Iterator<String> {

}
或者我应该把
MyClassIterator
放在
MyClass
之外
class MyClass implements Iterable<String> {
    public String[] a = null;
    public MyClass(String[] arr) {
        a = arr;    
    }
    public MyClassIterator iterator() {
        return new MyClassIterator(this);
    }
}


    public class MyClassIterator implements Iterator<String> {
        private MyClass myclass = null;
        private int count = 0;
        public MyClassIterator(MyClass m) {
            myclass = m;    
        }

        public boolean hasNext() {
            return count < myclass.a.length;
        }
        public String next() {
            int t = count;
            count++;
            return myclass.a[t];
        }

        public void remove() {
            throw new UnsupportedOperationException();
        }
    }   
哪一个更好?     
已邀请:
几乎不要在同一类中同时实现
Iterable
Iterator
。他们做不同的事情。迭代器自然是有状态的-当您迭代使用它时,它必须更新其世界观。但是,迭代器仅需要能够创建新的迭代器。特别是,您可能有多个迭代器同时处理同一个原始可迭代对象。 您当前的方法几乎可以-我会更改实现的某些方面,但是就职责分离而言还可以。     
您的第一次尝试已步入正轨。
MyClass
仅需要实现
Iterable<String>
,这又需要您提供
Iterator<String>
实现以从
Iterable<String>.iterator()
返回。 不需要将ѭ4放在ѭ5之外,因为在大多数情况下,您甚至都不需要直接使用
Iterator<String>
(by10的ѭ16语法隐式使用了ѭ11),并且在所有其他情况下,接口都是除非您实际上向实现中添加了其他行为(您可能永远不需要这样做),否则它们就足够了。 这是我的处理方式,请参阅内嵌的注释:
import java.util.Iterator;

class MyClass implements Iterable<String>{
    public String[] a=null; //make this final if you can
    public MyClass(String[] arr){
        a=arr; //maybe you should copy this array, for fear of external modification
    }

    //the interface is sufficient here, the outside world doesn\'t need to know
    //about your concrete implementation.
    public Iterator<String> iterator(){
        //no point implementing a whole class for something only used once
        return new Iterator<String>() {
            private int count=0;
            //no need to have constructor which takes MyClass, (non-static) inner class has access to instance members
            public boolean hasNext(){
                //simplify
                return count < a.length;
            }
            public String next(){
                return a[count++]; //getting clever
            }

            public void remove(){
                throw new UnsupportedOperationException();
            }
        };
    }
}
    
您不应该执行“ 19”,因为迭代器是一次性的。除列表迭代器外,无法将它们返回到开始。 顺便说一句,您可以跳过
MyClass myClass;
public MyClassInterator(MyClass m){
  myclass=m;  
}
而不是引用
myClass
参考
MyClass.this
您的内部类不是静态的,因此ѭ23将引用创建它的封闭类的实例。     
我想这是同时实现Iterable和Iterator的标准方法。
// return list of neighbors of v
public Iterable<Integer> adj(int v) {
    return new AdjIterator(v);
}

// support iteration over graph vertices
private class AdjIterator implements Iterator<Integer>, Iterable<Integer> {
    private int v;
    private int w = 0;

    AdjIterator(int v) {
        this.v = v;
    }

    public Iterator<Integer> iterator() {
        return this;
    }

    public boolean hasNext() {
        while (w < V) {
            if (adj[v][w]) return true;
            w++;
        }
        return false;
    }

    public Integer next() {
        if (!hasNext()) {
            throw new NoSuchElementException();
        }
        return w++;
    }
参考https://algs4.cs.princeton.edu/41graph/AdjMatrixGraph.java.html。     

要回复问题请先登录注册