给定一个整数数组,我需要显示一个表示每个整数的图。 例如,给定数组{2,4,6,-3,-4,5,-1,-2,3},控制台上的输出应类似于:
*
* *
* * *
* * * *
* * * * *
* * * * *
* * * *
* * *
* *
*
我采用了矩阵方法,但是到目前为止,我只能获得所需图形的水平版本(更精确地说,是所需图形的90°顺时针旋转版本)。 如何将图表沿逆时针方向旋转90°,以获得所需的结果?我尝试换位结果矩阵,但是图形变成所需结果的确切逆。
这是代码,
public static char[][] plot(int[] array) {
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int i = 0; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
}
if (array[i] < min) {
min = array[i];
}
}
if (min < 0) {
min *= (-1);
}
char[][] tempArray = new char[array.length][max + min + 1];
for (int i = 0; i < tempArray.length; i++) {
if (array[i] > 0) {
for (int j = (min + 1); j <= min + array[i]; j++) {
tempArray[i][j] = '*';
}
System.out.println();
} else {
for (int j = min - 1; j >= min + array[i]; j--) {
tempArray[i][j] = '*';
}
}
}
return tempArray;
}
public static void main(String...s){
int[] arr = {2,4,6,-3,-4,5,-1,-2,3};
System.out.println(Arrays.deepToString(plot(arr)));
}
此外,我无法很好地格式化输出矩阵(我仍在查看那里发生了什么),所以我使用了Arrays.deeptoString()。
答案 0 :(得分:0)
我制作了自己的绘图仪(plot0
),该绘图仪逐字符直接写到输出流中,逐行:
private static void plot0(final int... numbers) {
final int cols = numbers.length;
final IntSummaryStatistics stat = Arrays.stream(numbers).summaryStatistics();
final int max = stat.getMax();
final int min = stat.getMin();
final int rows;
if (min < 0) {
rows = Math.max(0, max) + ~min + 2;
} else {
rows = max;
}
for (int i = 0; i < rows; i++) {
final int val = Math.max(0, max) - i;
if (0 == val) {
continue; // do not plot zero
}
for (int j = 0; j < cols; j++) {
final int num = numbers[j];
System.out.print(
0 < num && 0 < val && num >= val
|| 0 > num && 0 > val && num <= val
? '*'
: ' ');
}
System.out.println();
}
}
我对您的代码做了一些小的更改(重命名为plot1
),但是基本上原始的想法可行。
Arrays.deepToString(tempArray[i])
更改为new String(tempArray[i])
' '
中用Arrays.fill(tempArray[i], ' ');
填充零值'*'
值之后,而不是在'*'
值会覆盖' '
,因此您无法直接写入输出。private static void plot1(final int... array) {
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (final int element : array) {
if (element > max) {
max = element;
}
if (element < min) {
min = element;
}
}
if (min < 0) {
min *= -1;
}
final char[][] tempArray = new char[array.length][max + min + 1];
for (int i = 0; i < tempArray.length; i++) {
Arrays.fill(tempArray[i], ' ');
if (array[i] > 0) {
for (int j = min + 1; j <= min + array[i]; j++) {
tempArray[i][j] = '*';
}
} else if (array[i] < 0) {
for (int j = min - 1; j >= min + array[i]; j--) {
tempArray[i][j] = '*';
}
}
System.out.println(new String(tempArray[i]));
}
}