如何为泛型二维Matrix类实现Iterator以支持迭代遍历?
为泛型Matrix类实现Iterator的解决方案
嘿,我来帮你搞定这个泛型矩阵的迭代器问题!首先得提个小细节:你构造器里把数组强转成String[][]其实不太合适——如果你的泛型类型T是Integer这类非String类型时,会直接触发类型转换错误。应该换成Object[][]来初始化,这样能适配所有泛型引用类型(注意int是基本类型,得用它的包装类Integer哦)。
下面是完整的Matrix类实现,包含迭代器的实现逻辑:
import java.util.Iterator; import java.util.NoSuchElementException; public class Matrix<T> implements Iterable<T> { private T[][] matrix; private int rows; private int columns; public Matrix(int rows, int columns) { this.rows = rows; this.columns = columns; // 用Object数组初始化,适配所有泛型引用类型 matrix = (T[][]) new Object[rows][columns]; } // 插入元素到指定行、列(索引从0开始) public void insert(int row, int col, T value) { if (row < 0 || row >= rows || col < 0 || col >= columns) { throw new IndexOutOfBoundsException("行或列索引越界"); } matrix[row][col] = value; } // 获取指定位置的元素 public T get(int row, int col) { if (row < 0 || row >= rows || col < 0 || col >= columns) { throw new IndexOutOfBoundsException("行或列索引越界"); } return matrix[row][col]; } @Override public Iterator<T> iterator() { return new MatrixIterator(); } // 内部迭代器类,实现按行优先遍历 private class MatrixIterator implements Iterator<T> { private int currentRow = 0; private int currentCol = 0; @Override public boolean hasNext() { // 判断是否还有未遍历的元素 return currentRow < rows && currentCol < columns; } @Override public T next() { if (!hasNext()) { throw new NoSuchElementException("矩阵中没有更多元素了"); } T element = matrix[currentRow][currentCol]; // 移动遍历索引:当前列遍历完则切换到下一行,列重置为0 currentCol++; if (currentCol == columns) { currentRow++; currentCol = 0; } return element; } } }
怎么在test2方法里使用?
直接用foreach循环就能遍历整个矩阵,示例如下:
public static void test2() { // 测试Integer类型矩阵 Matrix<Integer> intMatrix = new Matrix<>(2, 3); intMatrix.insert(0, 0, 1); intMatrix.insert(0, 1, 2); intMatrix.insert(0, 2, 3); intMatrix.insert(1, 0, 4); intMatrix.insert(1, 1, 5); intMatrix.insert(1, 2, 6); System.out.println("遍历Integer矩阵:"); for (Integer num : intMatrix) { System.out.print(num + " "); } System.out.println(); // 测试String类型矩阵 Matrix<String> strMatrix = new Matrix<>(2, 2); strMatrix.insert(0, 0, "Hello"); strMatrix.insert(0, 1, "World"); strMatrix.insert(1, 0, "Java"); strMatrix.insert(1, 1, "Generic"); System.out.println("遍历String矩阵:"); for (String str : strMatrix) { System.out.print(str + " "); } }
额外说明
- 这个迭代器是行优先遍历(先遍历第一行所有列,再遍历第二行,以此类推),如果需要列优先遍历,只需要调整
MatrixIterator里的索引移动逻辑即可。 - Java泛型是擦除机制,没法直接创建
T[][]数组,用Object[][]强转是泛型数组创建的常规做法。 - 泛型只支持引用类型,所以如果要存储int这类基本类型,必须用对应的包装类(Integer)。
内容的提问来源于stack exchange,提问作者Ollod
相关产品推荐
相关产品推荐

