// Histogram.java package net.sf.gogui.util; import java.io.PrintStream; /** Histogram for data samples. */ public class Histogram extends Statistics { public Histogram(double min, double max, double step) { m_min = min; m_max = max; m_step = step; m_size = Math.max(1, (int)Math.ceil((max - min) / step)); m_array = new int[m_size]; } public void add(double value) { super.add(value); int i; if (value == m_max) i = m_size - 1; else i = (int)((value - m_min) / m_step); ++m_array[i]; } public int getCount(int i) { return m_array[i]; } public double getHistoMin() { return m_min; } public double getHistoMax() { return m_max; } /** Return number of intervals. */ public int getSize() { return m_size; } public double getStep() { return m_step; } public double getValue(int i) { return m_min + i * m_step; } public void printHtml(PrintStream out) { out.print("<p>\n" + "<table border=\"0\" cellspacing=\"1\" cellpadding=\"0\"" + " rules=\"groups\">\n"); int min; for (min = 0; min < m_size - 1 && m_array[min] == 0; ++min) ; int max; for (max = m_size - 1; max > 0 && m_array[max] == 0; --max) ; for (int i = min; i <= max; ++i) { int scale = 630; int width = m_array[i] * scale / getCount(); if (getValue(i) >= 0 && getValue(i - 1) < 0) out.print("<tbody>\n"); out.print("<tr><td align=\"right\"><small>" + getValue(i) + "</small></td><td><table cellspacing=\"0\"" + " cellpadding=\"0\" border=\"0\" width=\"" + scale + "\"><tr>" + "<td bgcolor=\"#666666\" width=\"" + width + "\"></td>" + "<td bgcolor=\"#cccccc\" width=\"" + (scale - width) + "\"><small>" + m_array[i] + "</small></td></tr></table></td></tr>\n"); } out.print("</table>\n" + "</p>\n"); } private final int m_size; private final double m_max; private final double m_min; private final double m_step; private int[] m_array; }