如何用单循环输出矩阵(java)
How output matrix with a single loop (java)
如何使用单循环将二维数组的值以矩阵的形式输出(禁止使用Arraysclass或第三方库的方法)。
int[][] data = {{1,2,3},{4,5,6,7,8},{10}};
以矩阵形式输出到控制台!
1 2 3
4 5 6 7 8
10
int[][] data = {{1, 2, 3}, {4, 5, 6, 7, 8}, {10}};
int currSubArrayNum = 0;
for (int i = 0; currSubArrayNum < data.length; i++) {
System.out.print(data[currSubArrayNum][i]+" ");
if (i == data[currSubArrayNum].length - 1) {
currSubArrayNum++;
i = -1;
System.out.println();
}
}
最常见的循环解决方案是 2 个循环(一个嵌套在另一个循环中),如下所示:
for (int i=0; i<data.length(); i++) {
for (int j=0; j<data[i].length(); i++) {
System.out.printf("%d ", data[i][j]);
System.out.println();
编辑: 如果你想要 1 个循环,你的意思是也没有内部循环,我想到的唯一方法是为每个需要的打印运行一个循环(等于所有内部数组的总长度)。加上一些 if 语句,它是这样的:
int[][] data = {{1,2,3},{4,5,6,7,8},{10}};
int len = data[0].length + data[1].length + data[2].length;
int j = 0;
int h = 0;
for (int i=0; i<len; i++) {
if (h > 0 && h%data[j].length == 0) {
if (++j == data.length) {break;}
h=0;
System.out.println();
}
System.out.printf("%d ", data[j][h++%data[j].length]);
}
这不是很优雅,但这里有一个解释:
for 循环的 i
只是作为我们要打印的次数的指标。它不在循环条件或数组索引中使用。
h
作为当前数字位于内部数组中。当它到达内部数组的长度时,它被重置为零,并且 j 增加 1(下一行)。
j
用于表示内部数组的变化
这就是您完成此任务的方法。
首先写下您通常用来执行此操作的循环:
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
System.out.print(data[i][j] + " ");
}
System.out.println();
}
现在我说可以重写这段代码,使它只有一个循环。为了做到这一点,我将详细说明 for
循环对变量的实际作用:
int i = 0;
while (i < data.length) {
int j = 0;
while (j < data[i].length) {
System.out.print(data[i][j] + " ");
j++;
}
System.out.println();
i++;
}
然后我将j
变量移出外循环:
int i = 0;
int j = 0;
while (i < data.length) {
while (j < data[i].length) {
System.out.print(data[i][j] + " ");
j++;
}
System.out.println();
i++;
j = 0;
}
最后我决定,代码在哪个循环中运行并不重要,只要它在变量和循环的相同条件下运行...循环。
int i = 0;
int j = 0;
while (i < data.length) {
if (j < data[i].length) {
System.out.print(data[i][j] + " ");
j++;
} else {
System.out.println();
i++;
j = 0;
}
}
最后一步并不完全直截了当,但你不能否认与上一步的相似性。
任何嵌套循环都可以用这种技术展开。您将所有变量移到外面,并在各处用 if
s 替换 while
s,瞧!
诀窍是从元素 [x][y] 开始,对于每一步,打印出 (x,y) 并递增 y。如果 y 越界(即等于或大于 [x].length
),则递增 x 并重置 y 到 0(并打印出换行符)。
void matrix(int[][] array) {
int dim1 = 0;
int dim2 = 0;
while (dim1 < array.length) {
if (array[dim1].length > 0) {
System.out.print(array[dim1][dim2]);
System.out.print(" ");
}
dim2++; // Move to next element of sub-array
if (dim2 >= array[dim1].length) {
dim1++;
dim2 = 0;
System.out.println();
}
}
}
如果允许2个for循环
还在下一行打印每个子数组...
package com.github.manishktiwari.matrix;
/**
* @author manish
*
*/
public class PrintMatrixInSingleLoop {
/**
* @param args
*/
public static void main(String[] args) {
int[][] mat = {{1,2,3},{4,5,6,7,8},{10}};
// Dimensions of the matrix
int N = mat.length;
int M = getWidth(mat);
// Function Call
print2DMatrix(mat, N, M);
}
private static int getWidth(int[][] mat) {
int width = -1;
for (int i = 0; i < mat.length; i++) {
int[] innerArray = mat[i];
if (width < innerArray.length) {
width = innerArray.length;
}
}
return width;
}
public static void print2DMatrix(
int arr[][], int rows, int columns)
{
// Iterate over the range
// [0, rows*columns]
for (int i = 0;
i < rows * columns; i++) {
// Find row and column index
int row = i / columns;
int col = i % columns;
try {
// Print the element
System.out.print(
arr[row][col] + " ");
} catch (ArrayIndexOutOfBoundsException e) {
// TODO: handle exception
System.out.println();
i = i + (columns-col-1);
}
if (col == columns-1) {
System.out.println();
}
}
}
}
有几种方法。这是我的做法。
int[][] data = {{1,2,3},{4,5,6,7,8},{10}};
- 将
row
和col
初始化为0
。
- 循环中的条件是针对行的。
- 简单地打印
row, col
,值并递增 col
。
- 当 col 结束时,打印一个换行符,
col
到 0
并递增 row
.
for (int row = 0, col = 0; row < data.length;) {
System.out.print(data[row][col++] + " ");
if (col == data[row].length) {
System.out.println();
col = 0;
row++;
}
}
打印
1 2 3
4 5 6 7 8
10
重要的一点是在打印列之前不要增加 row
。
注意:
如果处理空行很重要,则将以下代码首先放在 for 循环块中。这将增加行并继续下一个。
if (data[row].length == 0) {
row++;
continue;
}
如何使用单循环将二维数组的值以矩阵的形式输出(禁止使用Arraysclass或第三方库的方法)。
int[][] data = {{1,2,3},{4,5,6,7,8},{10}};
以矩阵形式输出到控制台!
1 2 3
4 5 6 7 8
10
int[][] data = {{1, 2, 3}, {4, 5, 6, 7, 8}, {10}};
int currSubArrayNum = 0;
for (int i = 0; currSubArrayNum < data.length; i++) {
System.out.print(data[currSubArrayNum][i]+" ");
if (i == data[currSubArrayNum].length - 1) {
currSubArrayNum++;
i = -1;
System.out.println();
}
}
最常见的循环解决方案是 2 个循环(一个嵌套在另一个循环中),如下所示:
for (int i=0; i<data.length(); i++) {
for (int j=0; j<data[i].length(); i++) {
System.out.printf("%d ", data[i][j]);
System.out.println();
编辑: 如果你想要 1 个循环,你的意思是也没有内部循环,我想到的唯一方法是为每个需要的打印运行一个循环(等于所有内部数组的总长度)。加上一些 if 语句,它是这样的:
int[][] data = {{1,2,3},{4,5,6,7,8},{10}};
int len = data[0].length + data[1].length + data[2].length;
int j = 0;
int h = 0;
for (int i=0; i<len; i++) {
if (h > 0 && h%data[j].length == 0) {
if (++j == data.length) {break;}
h=0;
System.out.println();
}
System.out.printf("%d ", data[j][h++%data[j].length]);
}
这不是很优雅,但这里有一个解释:
-
for 循环的
i
只是作为我们要打印的次数的指标。它不在循环条件或数组索引中使用。h
作为当前数字位于内部数组中。当它到达内部数组的长度时,它被重置为零,并且 j 增加 1(下一行)。j
用于表示内部数组的变化
这就是您完成此任务的方法。
首先写下您通常用来执行此操作的循环:
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
System.out.print(data[i][j] + " ");
}
System.out.println();
}
现在我说可以重写这段代码,使它只有一个循环。为了做到这一点,我将详细说明 for
循环对变量的实际作用:
int i = 0;
while (i < data.length) {
int j = 0;
while (j < data[i].length) {
System.out.print(data[i][j] + " ");
j++;
}
System.out.println();
i++;
}
然后我将j
变量移出外循环:
int i = 0;
int j = 0;
while (i < data.length) {
while (j < data[i].length) {
System.out.print(data[i][j] + " ");
j++;
}
System.out.println();
i++;
j = 0;
}
最后我决定,代码在哪个循环中运行并不重要,只要它在变量和循环的相同条件下运行...循环。
int i = 0;
int j = 0;
while (i < data.length) {
if (j < data[i].length) {
System.out.print(data[i][j] + " ");
j++;
} else {
System.out.println();
i++;
j = 0;
}
}
最后一步并不完全直截了当,但你不能否认与上一步的相似性。
任何嵌套循环都可以用这种技术展开。您将所有变量移到外面,并在各处用 if
s 替换 while
s,瞧!
诀窍是从元素 [x][y] 开始,对于每一步,打印出 (x,y) 并递增 y。如果 y 越界(即等于或大于 [x].length
),则递增 x 并重置 y 到 0(并打印出换行符)。
void matrix(int[][] array) {
int dim1 = 0;
int dim2 = 0;
while (dim1 < array.length) {
if (array[dim1].length > 0) {
System.out.print(array[dim1][dim2]);
System.out.print(" ");
}
dim2++; // Move to next element of sub-array
if (dim2 >= array[dim1].length) {
dim1++;
dim2 = 0;
System.out.println();
}
}
}
如果允许2个for循环 还在下一行打印每个子数组...
package com.github.manishktiwari.matrix;
/**
* @author manish
*
*/
public class PrintMatrixInSingleLoop {
/**
* @param args
*/
public static void main(String[] args) {
int[][] mat = {{1,2,3},{4,5,6,7,8},{10}};
// Dimensions of the matrix
int N = mat.length;
int M = getWidth(mat);
// Function Call
print2DMatrix(mat, N, M);
}
private static int getWidth(int[][] mat) {
int width = -1;
for (int i = 0; i < mat.length; i++) {
int[] innerArray = mat[i];
if (width < innerArray.length) {
width = innerArray.length;
}
}
return width;
}
public static void print2DMatrix(
int arr[][], int rows, int columns)
{
// Iterate over the range
// [0, rows*columns]
for (int i = 0;
i < rows * columns; i++) {
// Find row and column index
int row = i / columns;
int col = i % columns;
try {
// Print the element
System.out.print(
arr[row][col] + " ");
} catch (ArrayIndexOutOfBoundsException e) {
// TODO: handle exception
System.out.println();
i = i + (columns-col-1);
}
if (col == columns-1) {
System.out.println();
}
}
}
}
有几种方法。这是我的做法。
int[][] data = {{1,2,3},{4,5,6,7,8},{10}};
- 将
row
和col
初始化为0
。 - 循环中的条件是针对行的。
- 简单地打印
row, col
,值并递增col
。 - 当 col 结束时,打印一个换行符,
col
到0
并递增row
.
for (int row = 0, col = 0; row < data.length;) {
System.out.print(data[row][col++] + " ");
if (col == data[row].length) {
System.out.println();
col = 0;
row++;
}
}
打印
1 2 3
4 5 6 7 8
10
重要的一点是在打印列之前不要增加 row
。
注意: 如果处理空行很重要,则将以下代码首先放在 for 循环块中。这将增加行并继续下一个。
if (data[row].length == 0) {
row++;
continue;
}