0

我正在尝试使用 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。我想知道如何在视觉上放大差异?因为我在终端打印直方图,所以我不能使用图形直方图库,除非它可以将图像保存为文件。

4

3 回答 3

2

我也推荐这个:
你有min_vmax_v价值,然后选择你想要多少颗星作为max_v价值(比如,适合一半的屏幕) - 表示为 N,还有 M < N 颗星作为min_v价值(可以是 0,例如)然后,每个值的星数为:

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

于 2013-10-27T22:59:57.883 回答
1

与其对 的每个偏差做一个星,不如baseValue将其设为例如与基值的每十分之一偏差的一个星:

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

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

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

  • 确定要显示的最大星数(取决于终端大小)
  • 计算差异diff = max - min
  • 对于每颗星,你需要step = diff/stars增加它的价值才能出现。
于 2013-10-27T22:42:06.707 回答
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();
                   
      }
    }
于 2020-11-20T16:47:34.703 回答