I am finishing up a program but am having a bit of trouble with one last aspect. In this part of the program, I am testing to see if the array is jagged (same number of rows and columns). I am wanting to use a nested for loop
to do this, but am having trouble with the logic and structure.
Array:
1, 2, 3
4, 5, 6
7, 8, 9, 10
Can anyone offer me guidance on the best way to do so?
Start with being clear about what a jagged array is (sticking to 2D arrays as the typical case):
- Technically a jagged array is an array of (1D) arrays, each of which can have a different length.
- Often what people mean by "jagged array" (including you I think) is an array with (1D) array elements that do vary in length - i.e. "effectively jagged".
- Finally, an array that is technically jagged but has the "same number of rows and columns" is (effectively) a square array.
(Notice that effectively jagged and effectively square arrays are mutually exclusive.)
You do not need nested for
loops to check for any of these three conditions:
- Condition 1 is self-evident by virtue of a
int[][]
declaration. - Conditions 2 and 3 necessitate one
for
loop - because you do not need to iterate through the array that contains the potentially different-length arrays and the potentially different-length arrays, just iterate through the former and check the lengths of the latter.
Having said this, consider the following IsJagged
and IsSquare
implementations and demo:
public class IsJaggedDemo {
private static boolean IsJagged(int[][] array) {
boolean isJagged = false;
if (array != null) {
Integer lastLength = null;
for (int i = 0; i < array.length; i++) {
if (lastLength == null) {
lastLength = array[i].length;
} else if (lastLength.equals(array[i].length)) {
continue;
} else {
isJagged = true;
break;
}
}
}
return isJagged;
}
private static boolean IsSquare(int[][] array) {
boolean isSquare = false;
if (array != null) {
for (int i = 0; i < array.length; i++) {
if (array[i].length != array.length) {
isSquare = false;
break;
} else if (i == array.length - 1) {
continue;
} else {
isSquare = true;
}
}
}
return isSquare;
}
public static void main(String[] args) {
int[][] a = null;
int[][] b =
new int[][] {
new int[] { 1, 2, 3 },
new int[] { 4, 5, 6 },
new int[] { 7, 8, 9 }
};
int[][] c =
new int[][] {
new int[] { 1, 2, 3 },
new int[] { 4, 5, 6 },
new int[] { 7, 8, 9, 10 }
};
int[][] d =
new int[][] {
new int[] { 1, 2, 3 }
};
int[][] e =
new int[][] {
new int[] { 1, 2, 3 },
new int[] { 4, 5, 6 },
new int[] { 7, 8, 9 },
new int[] { 9, 8, 7 }
};
System.out.printf(
"a is %1$sjagged and is %2$ssquare.\r\n",
IsJagged(a) ? "" : "not ",
IsSquare(a) ? "" : "not ");
System.out.printf(
"b is %1$sjagged and is %2$ssquare.\r\n",
IsJagged(b) ? "" : "not ",
IsSquare(b) ? "" : "not ");
System.out.printf(
"c is %1$sjagged and is %2$ssquare.\r\n",
IsJagged(c) ? "" : "not ",
IsSquare(c) ? "" : "not ");
System.out.printf(
"d is %1$sjagged and is %2$ssquare.\r\n",
IsJagged(d) ? "" : "not ",
IsSquare(d) ? "" : "not ");
System.out.printf(
"e is %1$sjagged and is %2$ssquare.\r\n",
IsJagged(e) ? "" : "not ",
IsSquare(e) ? "" : "not ");
}
}
If you run the demo, you should see the following output:
a is not jagged and is not square.
b is not jagged and is square.
c is jagged and is not square.
d is not jagged and is not square.
e is not jagged and is not square.
I am finishing up a program but am having a bit of trouble with one last aspect. In this part of the program, I am testing to see if the array is jagged (same number of rows and columns). I am wanting to use a nested for loop
to do this, but am having trouble with the logic and structure.
Array:
1, 2, 3
4, 5, 6
7, 8, 9, 10
Can anyone offer me guidance on the best way to do so?
Start with being clear about what a jagged array is (sticking to 2D arrays as the typical case):
- Technically a jagged array is an array of (1D) arrays, each of which can have a different length.
- Often what people mean by "jagged array" (including you I think) is an array with (1D) array elements that do vary in length - i.e. "effectively jagged".
- Finally, an array that is technically jagged but has the "same number of rows and columns" is (effectively) a square array.
(Notice that effectively jagged and effectively square arrays are mutually exclusive.)
You do not need nested for
loops to check for any of these three conditions:
- Condition 1 is self-evident by virtue of a
int[][]
declaration. - Conditions 2 and 3 necessitate one
for
loop - because you do not need to iterate through the array that contains the potentially different-length arrays and the potentially different-length arrays, just iterate through the former and check the lengths of the latter.
Having said this, consider the following IsJagged
and IsSquare
implementations and demo:
public class IsJaggedDemo {
private static boolean IsJagged(int[][] array) {
boolean isJagged = false;
if (array != null) {
Integer lastLength = null;
for (int i = 0; i < array.length; i++) {
if (lastLength == null) {
lastLength = array[i].length;
} else if (lastLength.equals(array[i].length)) {
continue;
} else {
isJagged = true;
break;
}
}
}
return isJagged;
}
private static boolean IsSquare(int[][] array) {
boolean isSquare = false;
if (array != null) {
for (int i = 0; i < array.length; i++) {
if (array[i].length != array.length) {
isSquare = false;
break;
} else if (i == array.length - 1) {
continue;
} else {
isSquare = true;
}
}
}
return isSquare;
}
public static void main(String[] args) {
int[][] a = null;
int[][] b =
new int[][] {
new int[] { 1, 2, 3 },
new int[] { 4, 5, 6 },
new int[] { 7, 8, 9 }
};
int[][] c =
new int[][] {
new int[] { 1, 2, 3 },
new int[] { 4, 5, 6 },
new int[] { 7, 8, 9, 10 }
};
int[][] d =
new int[][] {
new int[] { 1, 2, 3 }
};
int[][] e =
new int[][] {
new int[] { 1, 2, 3 },
new int[] { 4, 5, 6 },
new int[] { 7, 8, 9 },
new int[] { 9, 8, 7 }
};
System.out.printf(
"a is %1$sjagged and is %2$ssquare.\r\n",
IsJagged(a) ? "" : "not ",
IsSquare(a) ? "" : "not ");
System.out.printf(
"b is %1$sjagged and is %2$ssquare.\r\n",
IsJagged(b) ? "" : "not ",
IsSquare(b) ? "" : "not ");
System.out.printf(
"c is %1$sjagged and is %2$ssquare.\r\n",
IsJagged(c) ? "" : "not ",
IsSquare(c) ? "" : "not ");
System.out.printf(
"d is %1$sjagged and is %2$ssquare.\r\n",
IsJagged(d) ? "" : "not ",
IsSquare(d) ? "" : "not ");
System.out.printf(
"e is %1$sjagged and is %2$ssquare.\r\n",
IsJagged(e) ? "" : "not ",
IsSquare(e) ? "" : "not ");
}
}
If you run the demo, you should see the following output:
a is not jagged and is not square.
b is not jagged and is square.
c is jagged and is not square.
d is not jagged and is not square.
e is not jagged and is not square.
0 commentaires:
Enregistrer un commentaire