采用数组小于等于或大于 3x3 的二维数组构造函数

2d array constructor that take array less equals or more than 3x3

从我的学位中得到一个项目,我被困在其中一个构造函数上。

请注意,给定的数组可能是非对称的,甚至可能有不同长度的行。

当且仅当给定数组中的相应单元格不存在时,确保将单元格初始化为 -1。

您可以假设数组不为空。

当给定的数组大于 3x3 时,以下代码对我有效,但当它小于 3x3 时,我无法使其工作。

请注意,所有这些都需要位于与 main 不同的 class 中。

感谢您的帮助。

我得到以下代码:

public class Square3x3 {
        
    private int[][] Square3x3;
    
    public Square3x3(int[][]array) {
        Square3x3 = new int[3][3];
        int count =0;
        for (int i = 0; i < 3 && i < array.length; i++) {
            for (int j = 0; j < 3 && j < array[count].length; j++) {
                Square3x3[i][j] = array[i][j];
            }
            count++;
        }
    }
}

您必须更详细地查看初始化数组的逻辑。如果索引不存在则为-1;否则它将是 i-j 索引处的值。所以你必须看看数组是否至少有第 i 行。如果不是,你马上就会知道对于给定的 (i,j) 你有 -1。如果它至少有第 i 行,它是否有第 j 个元素?如果否,则再次-1。否则它是数组的第 i-j 个元素。

private int[][] square3x3;

public Square3x3(int[][] array) {
    final int dim = 3;
    final int defVal = -1;
    square3x3 = new int[dim][dim];
    for (int i = 0; i < dim; i++) {
        for (int j = 0; j < dim; j++) {
            final int val;
            if (array.length < (i + 1)) {
                val = defVal;
            } else {
                if (array[i].length < (j + 1)) {
                    val = defVal;
                } else {
                    val = array[i][j];
                }
            }
            square3x3[i][j] = val;
        }
    }
}
  1. 构造一个3x3大小的结果数组,并用-1填充。
  2. 根据需要从输入数组中复制值,选择输入数组的最小值 3 和 rows/columns。
private int[][] square3x3 = {
    {-1, -1, -1},
    {-1, -1, -1},
    {-1, -1, -1}
};

public Square3x3(int[][] array) {
    for (int i = 0, n = Math.min(3, array == null ? -1 : array.length); i < n; i++) {
        for(int j = 0, m = Math.min(3, array[i] == null ? -1 : array[i].length); j < m; j++) {
            square3x3[i][j] = array[i][j];
        }
    }
}

因此,如果输入的维度 array 小于 3x3,则在复制值时将使用预填充值 -1。

测试:

Square3x3 sq = new Square3x3(new int[3][2]); // input 2D arr initialized with 0
        
System.out.println(Arrays.deepToString(sq.square3x3));

// jagged input
sq = new Square3x3(new int[][]{{1, 2}, {3}, {4, 5, 6}});
System.out.println(Arrays.deepToString(sq.square3x3));
// input with nulls
mc = new MyClass(new int[][]{{1, 2}, null, {3}});
System.out.println(Arrays.deepToString(mc.square3x3));

输出:

[[0, 0, -1], [0, 0, -1], [0, 0, -1]]
[[1, 2, -1], [3, -1, -1], [4, 5, 6]]
[[1, 2, -1], [-1, -1, -1], [3, -1, -1]]

为了解决关于将单元格设置为 -1 的有点异想天开的要求 当且仅当给定数组中的相应单元格不存在时,可以提供以下实现:

private int[][] square3x3;
public Square3x3(int[][] array) {
    square3x3 = new int[3][3]; // anyway an array filled with 0 is created
        
    for (int i = 0; i < 3; i++) {
        for(int j = 0; j < 3; j++) {
            square3x3[i][j] = null != array    && i < array.length 
                           && null != array[i] && j < array[i].length
                            ? array[i][j] : -1;
        }
    }
}

该要求试图以 convoluted/sophisticated 方式提供具体实现,但这与预期输出无关,实际上需要 运行 通过循环中的所有 3x3 单元格,同时可以实现完全相同的结果通过适当的初始化和不相关的 rows/cols 可能会被跳过。

public void whosThereRow (int row, boolean [] values)

该方法的工作原理:

该方法接收一个行号(来自值 2、1、0)和一个布尔数组 尺码 10.

对于方法class中二维数组中相应行中出现的每个9-1之间的数字,将在值数组中的相应单元格中放置一个真值。

数组中的其余单元格将保持不变。

我用这种方式处理起来既不美观也不合逻辑。

我所做的是分别处理每个边缘情况...

 public Square3x3(int[][] array)
{
    int val;
    int vala;

    _square3x3 = new int[ROWS][COLS];
    if(_square3x3.length <= array.length ) // checking if given array length is bigger or equal
    {
        {
            for(int i = 0; i < ROWS; i++) // iterating over the first row
            {
                for(int j = 0; j < COLS; j++ ) // iterating over row indexes
                {
                    if(_square3x3[j].length > array[j].length) //if 3 is bigger the array row length
                    {
                        val = array[j].length; // saving the row length
                        vala = i; //saving row index
                        for(int k = val; k < COLS; k++ ) //loop between the array row length till k is 3
                            _square3x3[vala][k] = -1; // completing missing row cells with -1

                    }
                    else if(_square3x3[j].length <= array[j].length) //if given array row lenght is equal or bigger
                    {
                        for(int a = 0; a < ROWS; a++)
                        {
                            for(int b = 0; b < COLS; b++ )
                            {
                                _square3x3[a][b] = array[a][b]; //taking only first 3x3 cells
                            }
                        }
                    }

                }
            }
        }
    }
    else  // applied this condition only if array.length is smallar then square3x3.length
    {
        int rowNdxCounter = 0;

        for (int i = 0; i < array.length; i++)
        {
            for (int j =0; j < COLS; j++) //looping over all cells
            {
                rowNdxCounter++; // for each cell value is increasing by one
            }
            if (rowNdxCounter != 3) //if counter not equals to three then i need to fill in the row with value of -1
            {
                for (int c=rowNdxCounter; c < COLS; c++)
                    _square3x3[i][c] = -1;
            } 
            rowNdxCounter = 0;
        }
        for (int k = array.length; k < ROWS; k++) //looping over the missing row
            for(int j = 0; j < COLS; j++) //looping over cells in the missing rows
                _square3x3[k][j] = -1; // filling them with -1

    }

当然,所有的括号看起来确实很长而且很原始。 但是在方法的第一部分, 当给定数组大于或等于并且 将其分为两种情况:

第一种情况: 如果行长度大于给定数组的行长度,并且给定数组行长度之一更小

  1. 保留行单元格索引并保留当前行索引。
  2. 然后在目标行上运行并用-1填充缺失的单元格 如果给定数组的行长度之一大于或等于
  3. 运行 在目标行上,并确保取前 3 个单元格

第二种情况

如果给定的数组长度更小。只有这样它才会进入第二种情况。

  1. 设置一个计数器供以后使用。
  2. 首先确保每行中包含三个单元格。为此,我在整个行中循环以获取我在行中有多少个单元格并使用计数器。

如果行没有三个单元格,(这就是为什么 使用计数器),然后用 -1

填充缺失的单元格
  1. 确保行已填充后,我将循环遍历剩余的行并用 -1 填充它们。