我正在尝试使用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.我想知道如何在视觉上放大差异?因为我在终端中打印出直方图,所以我不能使用图形直方图库,除非它可以将图像保存为文件。
答案 0 :(得分:2)
我也建议这样:
您有min_v
和max_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();
}
}