【问题标题】:Iterator and iterable for an 2D array Java2D数组Java的迭代器和可迭代
【发布时间】:2015-11-17 12:39:27
【问题描述】:

我为数组创建了两个迭代器:第一个按行 (iteratorRow) 运行数组,然后按列运行,第二个,先按列运行,然后按行运行 (iteratorColumn)。

我有另一个类 Matrix,我必须在其中创建两个用于执行迭代的方法(iteratorRowColumn 和 iteratorColumnRow),它们返回已创建的迭代器以供其他类访问。​​

数组必须实现 Iterable 接口,并且可以通过调用 iterator() 方法来配置(使用布尔值)两个迭代器中的哪一个。

我该怎么做?我必须做一些吸气剂方法吗?像这样?

public Iterator iteratorRowColumn () {
    return new iteratorRow;
}

【问题讨论】:

  • "数组必须实现 Iterable 接口,并且可以通过调用 iterator() 方法来配置(使用布尔值)两个迭代器中的哪一个将被退还。 - 您创建对象 new 2DArray(true) 并根据参数,覆盖方法 iterator() 将返回一个或另一个。

标签: java iterator iterable


【解决方案1】:

我认为 assignment 的最后一句话很好地解释了一个问题。我不确定它的哪一部分不清楚,所以让我详细解释一下:

数组必须实现Iterable接口

public class Matrix<T> implements Iterable<T>

可以配置(使用布尔值)

public Matrix(boolean defaultRowColumnIterator) {
    this.defaultRowColumnIterator = defaultRowColumnIterator;
}

调用 iterator() 方法将返回两个迭代器中的哪一个

@Override
public Iterator<T> iterator() {
    return defaultRowColumnIterator ? iteratorRowColumn() : iteratorColumnRow();
}

这是一个可编译的例子:

public class Matrix<T> implements Iterable<T> {

    T[][] array;
    boolean defaultRowColumnIterator;

    public Matrix(boolean defaultRowColumnIterator) {
        this.defaultRowColumnIterator = defaultRowColumnIterator;
    }

    // other methods and constructors

    public Iterator<T> iteratorRowColumn() {
        return null; // your current implementation
    }

    public Iterator<T> iteratorColumnRow() {
        return null; // your current implementation
    }

    @Override
    public Iterator<T> iterator() {
        return defaultRowColumnIterator ? iteratorRowColumn() : iteratorColumnRow();
    }

}

【讨论】:

    【解决方案2】:

    类似这样的:

    public class Proba {
    
        Integer[][] array = new Integer[10][10];
    
        public class MyIter implements Iterator<Integer> {
    
            private Integer[] integers;
            private int index = 0;;
    
            public MyIter(Integer[] integers) {
                this.integers = integers;
            }
    
            @Override
            public boolean hasNext() {
                return index < integers.length -1 ;
            }
    
            @Override
            public Integer next() {
                return integers[index];
            }
    
            @Override
            public void remove() {
                //TODO: remove
            }
        }
    
        public static void main(String[] args) {
            Iterator<Integer> iter = new Proba().getIterator(1);
            while (iter.hasNext()) {
                System.out.println(iter.next());
            }
        }
    
        public Iterator<Integer> getIterator(int row) {
            return new MyIter(array[row]);
        }
    }
    

    【讨论】:

    • "数组必须实现Iterable接口"
    • 一个数组不能实现任何东西,你可以创建一个 MyArray 或 Matrix 类并将数组放入 MyIter。那将是相同的。
    • 通过实现一个数组,我认为这意味着实现一个将数据存储在二维数组中并允许对其进行迭代的类。对于您的代码,Proba 将是矩阵类,它没有按要求实现 Iterable 接口。
    猜你喜欢
    • 1970-01-01
    • 2021-08-24
    • 2011-07-06
    • 1970-01-01
    • 2016-06-15
    • 2010-11-25
    • 2019-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多