JAVA我从另一个数组中插入整数的嵌套for循环跳过了除第一个和最后一个值之外的整个部分

JAVA我从另一个数组中插入整数的嵌套for循环跳过了除第一个和最后一个值之外的整个部分,java,arrays,multidimensional-array,nested-loops,Java,Arrays,Multidimensional Array,Nested Loops,在我的家庭作业中,我们必须创建一个网格类,其中一个方法是setCells(int rows[],int cols[],int vals[]),用户可以在其中指定用户希望使用某些特定值设置的行和列的索引(在vals数组中提供)。请注意,行、列和VAL数组的大小应该相同 这是我到目前为止得到的 public void setCells(int rowsArray[ ], int columnsArray[ ], int valuesArray[ ]) { for (int rows = 0;

在我的家庭作业中,我们必须创建一个网格类,其中一个方法是setCells(int rows[],int cols[],int vals[]),用户可以在其中指定用户希望使用某些特定值设置的行和列的索引(在vals数组中提供)。请注意,行、列和VAL数组的大小应该相同

这是我到目前为止得到的

public void setCells(int rowsArray[ ], int columnsArray[ ], int valuesArray[ ]) {
    for (int rows = 0; rows < rowsArray.length; rows++) {
        for (int columns = 0; columns < columnsArray.length; columns++) {
            for (int values = 0; values < valuesArray.length; values++) {
                setValue(rows, columns, valuesArray[values]);
            }
        }
    }
}
这是输出

九十九 99 99 99 一,

我认为嵌套循环的逻辑有问题。 这是我编程的第一年,所以我已经思考了3个小时。如果你能帮我找出代码中的错误,我会很高兴的

编辑。 完整网格级别:

    public class Grid {
private int value;
private int[][] grid;

public Grid(int height, int width) {
    if (height == width) {
        grid = new int[height][width];
    } else{
        System.out.println("Height and width should be equal");
    }
}

public Grid(int size) {
      grid = new int[size][size];
}

public boolean isEmpty() {
    boolean empty = true;
    for (int i = 0; i < grid.length; i++) {
        for (int p = 0; p < grid.length; p++) {
            if (grid[i][p] != 0) {
                empty = false;
                break;
            }
        }

        if (!empty) {
            System.out.println("Grid is not empty");
            return false;
        }
    }
    if (true)
        System.out.println("Grid is empty");
        return true;
}

public void Clear() {
    for (int i = 0; i < grid.length; i++) {
        for (int p = 0; p < grid.length; p++) {
            grid[i][p] = 0;
        }
    }
}

public boolean isValid(int rows, int columns) {
    if(grid[rows][columns] == 0){
        return true;
    } else {
        return false;
    }
}

public void setValue(int rows, int columns, int value) {
    if (isValid(rows, columns)) {
        grid[rows][columns] = value;
        } else if(!isValid(rows, columns) && rows < grid.length && columns < grid.length) {
            grid[rows+1][columns+1] = value;
        }
    }

public int getValue(int rows, int columns){
    if(rows >= 0 && rows <= grid.length && columns >= 0 && columns <= grid.length ){
        System.out.println(grid[rows][columns]);
    }
    return value;
}

public void setCells(int rowsArray[], int columnsArray[], int valuesArray[]) {
    for (int rows = 0; rows < rowsArray.length; rows++) {
        for (int columns = 0; columns < columnsArray.length; columns++) {
            for (int values = 0; values < valuesArray.length; values++) {
                setValue(rows, columns, valuesArray[values]);
            }
        }
    }
}
全输出:

网格是空的 网格是空的

真的

真的 52 假的 五,

网格不是空的

真的 网格是空的

九十九 99 99 99 一,

一,


进程结束,退出代码为0

我想您是有意这样做的:

public void setCells(int rowsArray[ ], int columnsArray[ ], int valuesArray[ ]) {
    for (int i= 0; i< rowsArray.length; i++) {                  
        setValue(rowsArray[i], columnsArray[i], valuesArray[i]);    
    }
}
顺便说一句,更好的建模方法是使用单独的类来表示一组用户输入:

class UserInput {
    private final int row;
    private final int col;
    private final int value;

    UserInput (int row, int col, int value) { 
        this.row = row;
        this.col = col;
        this.val = val;
    }

    // getters and setters
}
每次用户输入新行/col/val时,您都会创建一个新的UserInput实例并将其添加到列表中:

List<UserInput> inputs = new UserInput<>();    

// for each set of user input do:

inputs.add(new UserInput(row, col, val));
您可以删除2-args构造函数,因为网格必须始终为正方形

你的代码有很大的缺陷。我认为isValid可能还应该检查网格大小。setValue方法应该做什么?如果单元格已填充,是否同时增加行索引和列索引?如果那个单元格也已经被填满了呢?你不需要第二个!在else中检查isValid(您刚刚在if中检查了isValid)

请多花些时间考虑一下代码的逻辑


下次,请立即发布完整的代码,以节省我们所有人的时间。

在最内部的循环中,您正在将值的所有值都写入同一单元格,这是没有意义的,也就是说,当行为2,列为3时,您首先将该单元格设置为1,然后设置为222,以此类推,以99结尾。

肯定会出现此输出,因为在
setCells()
方法中,您将
valuesArray[]
的所有值写入同一单元格

假设行的计数器值为0,列的计数器值为0,在第三个for循环中,它将迭代所有值,并将值放在同一单元格上,即网格[0][0]=1,然后网格[0][0]=222,依此类推,直到最后一个值将替换为网格[0][0]=99


因此,每次每个单元格只放置最后一个值,即99

请添加预期输出,这比描述您的目标更清楚。不幸的是,我的老师没有给我一个。是的,您理解正确。因此,我必须删除循环并在main中创建另外两个带有坐标的数组(例如valuesArray)。然后用坐标来改变值,对吗?不过,我需要一个循环来循环这个“坐标”。现在好多了。我的意见如下:120 31 0 42 0谢谢你的帮助。但我的老师讨厌我们使用我们还没学过的东西,所以我不能使用列表。而且输入还是很奇怪。现在它跳过了3个值:\n是的,这就是我所想的。然而,我不知道如何重写这些循环来避免那个错误。
int[] valuesArray = new int[] {12, 222, 31, 45, 42, 99};
int[] rowsArray = new int[] {5, 4, 3, 2, 1, 0};
int[] columnsArray = new int[] {5, 4, 3, 2, 1, 0};
Grid lol = new Grid(11);    
lol.setCells(rowsArray , columnsArray, valuesArray);
lol.getValue(5,5);
lol.getValue(4,4);
lol.getValue(3,3);
lol.getValue(2,2);
lol.getValue(1,1);
lol.getValue(0,0);
class UserInput {
    private final int row;
    private final int col;
    private final int value;

    UserInput (int row, int col, int value) { 
        this.row = row;
        this.col = col;
        this.val = val;
    }

    // getters and setters
}
List<UserInput> inputs = new UserInput<>();    

// for each set of user input do:

inputs.add(new UserInput(row, col, val));
for (UserInput i: inputs) {                  
    setValue(i.getRow(), i.getCol(), i.getValue());    
}