You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为泛型二维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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:30:38