2010-12-15 4 views
0

Моя программа должна нарисовать схему, как это:Как создать диаграмму из массивов в java?

--- 
    ---   xxx 
    ---   xxx 
+++ ---   xxx 
+++ ---  ooo xxx 
+++ ---  ooo xxx 
+++ ---  ooo xxx 
+++ --- *** ooo xxx 
+++ --- *** ooo xxx 
+++ --- *** ooo xxx 

Из этих данных:

private static final int[] DATA = {15, 21, 7, 12, 18}; 

private static final int MAX_HEIGHT = 10; 

private static final int COLUMN_WIDTH = 3; 

private static final int SPACE_BETWEEN_COLUMNS = 2; 

private static final char[] FILLER = {’+’, ’-’, ’*’, ’o’, ’x’}; 

мне действительно нужно несколько Guidlines о том, как это сделать.

Благодаря

+0

это интервью вопрос? – zengr 2010-12-15 08:20:55

+0

или домашнее задание, возможно? – Alnitak 2010-12-15 08:29:26

ответ

0

Вот прокомментировал выполнение вашей задачи:

public class DiagramMaker { 
    private final int[] data; 
    private final char[] filler; 
    private final int maxHeight; 
    private final int columnWidth; 
    private final int spacing; 

    private int[] colHeights; 

    public DiagramMaker(int[] data, char[] filler, int maxHeight, int columnWidth, int spacing) { 
     this.data = data; 
     this.filler = filler; 
     this.maxHeight = maxHeight; 
     this.columnWidth = columnWidth; 
     this.spacing = spacing; 
    } 

    /** 
     Primary method for writing the chart to StringBuffer 
    */ 
    public render(StringBuffer buffer) { 
    //Calculate the heights of all data columns scaled to our maxHeight 
     colHeights = DiagramMaker.getColumnHeights(data, maxHeight); 
    //Output all of our lines onto StringBuffer 
     for (int i=0;i<maxHeight;i++) { 
      printLine(buffer, i); 
     } 
    } 

    /** 
     Method for printing 1 line of the chart 
    */ 
    public void printLine(StringBuffer buffer, int lineNum) { 
    //Go through all columns 
     for (int i=0;i<colHeights.length;i++) { 
      //Check if current row can be seen on this line 
      if (colHeights[lineNum] >= maxHeight-lineNum) { 
       DiagramMaker.printColumnLine(buffer, filler[i], columnWidth); 
       //Should we draw the spacing 
       if (i < colHeights.length-1) { 
        DiagramMaker.printColumnLine(buffer, ' ', spacing); 
       } 
      } 
     } 
    } 

/** 
    Method for filling the given character specified amount of times into StringBuffer. Used for drawing columns and spacers. 
*/ 
    protected static void printColumnLine(StringBuffer buffer, char filler, int width) { 
     for (int i=0;i<width;i++) { 
      buffer.append(filler); 
     } 
    } 

    /** 
     Calculates the maximal data value 
    */ 
    protected static int getMaxData(int[] data) { 
     int maxData = 0; 
     for (int val : data) { 
      if (val > maxData) { 
       maxData = val; 
      } 
     } 
     return maxData; 
    } 

    /** 
     Gets the height of each column given max height and data 
    */ 
    protected static int[] getColumnHeights(int[] data, int maxHeight) { 
     int maxData = getMaxData(data) 
     int[] heights = new int[data.length]; 
     for (int i=0;i<data.length;i++) { 
      //Calculate the scale of this column 
      double scale = ((double)data[i])/maxData; 
      heights[i] = (int)(scale*data[i]); 
     } 
    } 
} 
1

Почему бы не захватить наибольшее значение в массиве, то отсчет времени оттуда?
Как вы обратный отсчет, вы пишете строку, если каждый индекс массива больше текущего порогового значения.

0

Несколько шагов:

  • создать StringBuilder, чтобы получить результат

  • создать ИНТ [] DATA_DIVIDED_BY_2.

  • во время этого создания, получить максимум, и число столбцов

  • цикл от макс до 0 (я)

  • цикл от 0 до NUMBER_OF_COL - 1 (к)

  • если DATA_DIVIDE_BY_2 [j]> = i, тогда result.append (FILLER [i]) 3 раза + 1 пробел. еще Append (4 пробела)

  • конец петли J, result.append ("\ п")

  • конца цикла я, печать result.toString()

0

Я хотел бы сделать это по строкам, а не по столбцам, чтобы он мог быть отправлен на устройство без доступа к предыдущим выходным линиям.

  1. Масштабируйте данные между 0 и MAX_HEIGHT.

  2. Вычитайте каждое масштабируемое значение с MAX_HEIGHT, чтобы получить количество пустых пространств (при условии, что самая высокая полоса всегда высока MAX_HEIGHT).

  3. Петля через ряды. Для каждой строки прокручивайте столбцы. Для каждого столбца, если текущий номер строки меньше числа ожидаемых для этого столбца пробелов, напечатайте пробелы. В противном случае напечатайте соответствующий символ заполнения.

Смежные вопросы