爪哇.我的嵌套循环是我从另一个数组中插入整数中的整数,除了第一个和最后一个值外,都跳过了整个部分



对于我的作业,我们必须创建一个网格类,其中一种方法是 setCells(int lows [],int cols [],int cols [],int vals [](,用户可以在其中指定用户想要用某些特定值设置的行和列的索引(在Vals数组中提供(。请注意,行,Cols和Vals阵列应具有相同的大小。

这是我到目前为止所拥有的。

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]);
            }
        }
    }
}

在主机上,我已经检查了此段是否有效。这是代码的一部分:

int[] valuesArray = new int[]{1, 222, 3, 45, 4, 99};
Grid lol = new Grid(11);
    lol.setCells(new int[5], new int[5], valuesArray);
    lol.getValue(4,4);
    lol.getValue(3,3);
    lol.getValue(2,2);
    lol.getValue(1,1);
    lol.getValue(0,0);

这是输出。

99 99 99 99 1

我认为嵌套循环的逻辑有问题。这是我在编程领域的第一年,所以我一直在考虑这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]);
            }
        }
    }
}

完整主体:

public class GridTest {
public static void main(String[] args) {
    int[] valuesArray = new int[]{1, 222, 3, 45, 4, 99};
    Grid kek = new Grid(10,10);
    Grid lol = new Grid(11);
    kek.isEmpty();
    lol.isEmpty();
    if(kek.isValid(4,5)){
        System.out.println("nTrue");
    }
    if(lol.isValid(6,1)){
        System.out.println("nTrue");
    }
    kek.setValue(4, 5, 52);
    kek.getValue(4,5);
    if(!kek.isValid(4,5)){
        System.out.println("False");
    }
    kek.setValue(4,5,5);
    kek.getValue(5,6);
    System.out.println();
    kek.isEmpty();
    kek.Clear();
    if(kek.isValid(4,5)){
        System.out.println("nTrue");
    }
    kek.isEmpty();
    System.out.println();
    lol.setCells(new int[5], new int[5], valuesArray);
    lol.getValue(4,4);
    lol.getValue(3,3);
    lol.getValue(2,2);
    lol.getValue(1,1);
    lol.getValue(0,0);

完整输出:

网格是空的网格为空

true

是真的52错误的5

网格不是空的

是真的网格为空

999999991

1

处理带有退出代码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]);    
    }
}

在您的测试代码中,rowsarray和valuesarray都填充了零,因为您没有设置任何值。

我希望这样的测试代码:

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
}

用户每次输入新的行/col/val时,您都会创建一个新的用户input实例,然后将其添加到列表:

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());    
}

您可以卸下2-args构造函数,因为您的网格必须始终为正方形。

您的代码非常有缺陷。我认为伊斯瓦利德也应该检查网格大小。SetValue方法应该做什么?如果单元格已经填充,则增加行和列索引?如果该单元格也已经填充了怎么办?您不需要第二个!

请花更多时间考虑您的代码逻辑。

下次,立即发布完整的代码以节省我们的一段时间。

在您最内向的循环中,您正在将所有值的值写入相同的单元格,即行是2且列是2且列是3您首先将该单元格设置为1然后到222,依此类推,以99结束。

肯定会预期此输出,因为在您的setCells()方法中,您正在同一单元格上编写valuesArray[]的所有值。

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

因此,每个单元格的每次都要放置99

最新更新