JAVA。我为从另一个数组向数组中插入整数而制作的嵌套 for 循环跳过了除第一个和最后一个值之外的整个部分
JAVA. My nested for loop which I made to insert integers in array from another array skips the whole part except the first and the last values
对于我的家庭作业,我们必须创建一个网格 class,其中一种方法是 setCells(int rows[], int cols[], int vals[]),用户可以在其中指定用户想要使用某些特定值设置的行和列的索引(在 vals 数组中提供)。请注意,rows、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 个小时。如果能帮我找出代码中的错误,我会很高兴。
已编辑。
全网格 Class:
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);
完整输出:
网格为空
网格为空
正确
对
52
错误的
5
网格不为空
对
网格为空
99
99
99
99
1
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 来表示一组用户输入:
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
}
每次用户输入新的 row/col/val 时,您都会创建一个新的 UserInput 实例并将其添加到列表中:
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 构造函数,因为您的网格必须始终是方形的。
您的代码有很多缺陷。我认为 isValid 也应该检查网格大小。 setValue 方法应该做什么?如果单元格已填充,则增加行和列索引?如果那个单元格也已经被填满了怎么办?您不需要在 else 中进行第二次 !isValid 检查(您刚刚在 if 中检查了 isValid)。
请多花点时间考虑一下代码的逻辑。
下一次,post 完整代码直接为我们节省一些时间。
在最内层的循环中,您将 valuesArray 的所有值写入同一个单元格,这是没有意义的,即当行为 2 且列为 3 时,您首先将该单元格设置为 1,然后设置为 222,依此类推以 99 结尾。
肯定会出现此输出,因为在您的 setCells()
方法中,您将 valuesArray[]
的所有值写入同一个单元格。
假设行 = 0 和列 = 0 的计数器值,并且在第 3 个 for 循环中它将迭代所有值并将值放在同一个单元格上,即 grid[0][0] = 1 然后 grid[0] [0] = 222 ans 依此类推,直到最后一个值将其替换为 grid[0][0] = 99.
所以每次每个单元格只放置最后一个值,即 99
对于我的家庭作业,我们必须创建一个网格 class,其中一种方法是 setCells(int rows[], int cols[], int vals[]),用户可以在其中指定用户想要使用某些特定值设置的行和列的索引(在 vals 数组中提供)。请注意,rows、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 个小时。如果能帮我找出代码中的错误,我会很高兴。
已编辑。 全网格 Class:
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);
完整输出:
网格为空 网格为空
正确
对 52 错误的 5
网格不为空
对 网格为空
99 99 99 99 1
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 来表示一组用户输入:
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
}
每次用户输入新的 row/col/val 时,您都会创建一个新的 UserInput 实例并将其添加到列表中:
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 构造函数,因为您的网格必须始终是方形的。
您的代码有很多缺陷。我认为 isValid 也应该检查网格大小。 setValue 方法应该做什么?如果单元格已填充,则增加行和列索引?如果那个单元格也已经被填满了怎么办?您不需要在 else 中进行第二次 !isValid 检查(您刚刚在 if 中检查了 isValid)。
请多花点时间考虑一下代码的逻辑。
下一次,post 完整代码直接为我们节省一些时间。
在最内层的循环中,您将 valuesArray 的所有值写入同一个单元格,这是没有意义的,即当行为 2 且列为 3 时,您首先将该单元格设置为 1,然后设置为 222,依此类推以 99 结尾。
肯定会出现此输出,因为在您的 setCells()
方法中,您将 valuesArray[]
的所有值写入同一个单元格。
假设行 = 0 和列 = 0 的计数器值,并且在第 3 个 for 循环中它将迭代所有值并将值放在同一个单元格上,即 grid[0][0] = 1 然后 grid[0] [0] = 222 ans 依此类推,直到最后一个值将其替换为 grid[0][0] = 99.
所以每次每个单元格只放置最后一个值,即 99