用Java打印直方图

时间:2013-10-27 22:21:37

标签: java histogram

我正在尝试使用TreeMap中的值打印出直方图。我使用最小的数字作为基数,数字与基数的比率决定了直方图条的高度。以下是我的代码:它将打印出由星号“*”表示的水平条。基数(值1)将有两颗星。然而,问题是所有其他酒吧也有两颗星,看起来没有什么不同的基础。

private static void printHistogram(TreeMap<String, Integer> mapA)
    {
        int baseVal = mapA.firstEntry().getValue();
        String baseKey = mapA.firstKey();

        for (Map.Entry<String, Integer> e : mapA.entrySet())
        {
            int times = e.getValue() / baseVal;
            System.out.print(e.getKey() + "\t \|");
            for (int j = 0; j < times; j++)
            {
                System.out.print("**");
            }
            System.out.print("\n");
        }
    }

这是直方图打印输出:

21  |**
22  |**
23  |**
24  |**
25  |**
26  |**
27  |**
28  |**
29  |**
30  |**
31  |**
32  |**
33  |**

以下是我的TreeMap中的数字(排序前):

99255
98321
98860
95365
85412
86105
84972
88132
80223
76273
74056
74077
52523

比率与基数52523相比小于2.我想知道如何在视觉上放大差异?因为我在终端中打印出直方图,所以我不能使用图形直方图库,除非它可以将图像保存为文件。

3 个答案:

答案 0 :(得分:2)

我也建议这样:
您有min_vmax_v值,然后选择您希望max_v值的星数(例如,适合屏幕的一半) - 表示为N,还有M&lt; ; min_v值的N个星(例如,可以是0) 然后,每个值的星数是:

M +(N - M)*(e.getValue() - min_v)/(max_v - min_v)

答案 1 :(得分:1)

不要为baseValue的每个偏差做一个星形,而是与基值每差十分之一的星号:

int times = e.getValue() / 0.1*baseVal;

然后可以将0.1转换为参数,具体取决于值的分布。如果它可以变得非常大,则增加它(0.2将为每个20%baseValue偏差创建一个星)。对于非常狭窄的数字,请将其缩小。

就个人而言,我会根据max和min之间的差异制作直方图,而不是取决于baseValue本身。

  • 确定要显示的最大星数(取决于终端大小)
  • 计算差异diff = max - min
  • 对于每个星标,您需要step = diff/stars增加值才能显示。

答案 2 :(得分:0)

 public static void histogram() {
        int [] n = {19, 3, 15, 7, 11, 9, 13, 5, 17, 1};
        System.out.println("Element"+"\t"+"Value"+"\t"+"Histogram");
        System.out.println();
        for (int i =0;i<n.length; i++){
          System.out.print(i+"\t"+n[i]+"\t");
            for(int j=0;j<n[i]; j++){
                System.out.print("*");
        }System.out.println();
                   
      }
    }