当前位置: 代码迷 >> java >> 图的绘制
  详细解决方案

图的绘制

热度:63   发布时间:2023-07-25 19:55:58.0

给定一个整数数组,我需要显示一个表示每个整数的图形。 例如,给定数组{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()。

我制作了自己的绘图仪( plot0 ),它逐字符地逐行直接写入输出流char:

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 ),但是基本上,最初的想法plot1

  1. Arrays.deepToString(tempArray[i])更改为new String(tempArray[i])
  2. 二维数组不可打印,请使用一行char代替
  3. Arrays.fill(tempArray[i], ' ');中用' '填充零值Arrays.fill(tempArray[i], ' ');
  4. 缺少打印的跳过0值,基线可见
  5. 填充所有'*'值之后的行尾,而不是之前
  6. '*'值会覆盖' ' ,因此您无法直接写入输出。

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]));
    }
}
  相关解决方案