【问题标题】:Creating a vertical histogram创建垂直直方图
【发布时间】:2017-06-19 01:22:01
【问题描述】:

基本上,我一直在尝试让我的直方图显示在它上面递增的字母上方垂直对齐的星号。我一直在试图找出让星号在重复字母上方对齐的最有效方法。有什么建议吗?

    **My current output displays this horizontally**

asfklafjasjfk
A (3) ***
F (3) ***
J (2) **
K (2) **
L (1) *
S (2) **
ABCDEFGHIJKLMNOPQRSTUVWXYZ

我想让它显示这个

  abcaaaabbzzzzz    
                           *  
  *                        *
  **                       *
  **                       *
  ***                      *
  ABCDEFGHIJKLMNOPQRSTUVWXYZ

我在下面列出了我的代码

public class histogram {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        String lettersInput = input.nextLine();
        lettersInput=lettersInput.toUpperCase();
        String map = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        int[] count = new int[map.length()];

        for(int x = 0; x <  lettersInput.length();x++){

            int letter = map.indexOf(lettersInput.charAt(x));

            if(letter < 0){

                continue;
            }

            count[letter]++;
        }
        for(int x = 0; x < count.length; x++){

            if(count[x]< 1)
                continue;
            System.out.println(String.format("%s (%d) %s",

                    map.charAt(x),

                    count[x],

                    new String(new char[count[x]]).replace('\0','*')));
        }

        System.out.println("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    }
}

【问题讨论】:

  • 它到底有什么问题?你试图解决什么?我们不是来为您调试代码的。
  • 我正在寻求有关让星号在其对应的字母上方垂直对齐的最佳方法的建议。

标签: java histogram


【解决方案1】:

我采用的方法是使用排序映射,其键是字母表中的字母,其值是每个字母出现的次数。只需遍历输入字符串即可填充地图。然后,遍历每一行可能的输出,并为每个字母打印一个空格或一个星号。我在地图的值上使用了Collections.max() 来查找直方图的高度。

TreeMap<Character, Integer> map = new TreeMap<>();
String input = "abcaaaabbzzzzz".toUpperCase();
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

for (int i=0; i < input.length(); ++i) {
    Integer val = map.get(input.charAt(i));
    map.put(input.charAt(i), val == null ? 1 : val + 1);
}
Collection<Integer> c = map.values();
int maxFrequency = Collections.max(c);

System.out.println("Input:\n" + input);
for (int i=maxFrequency; i > 0; --i) {
    for (int j=0; j < alphabet.length(); ++j) {
        Integer count = map.get(alphabet.charAt(j));
        System.out.print((count != null && count >= i) ? "*" : " ");
    }
    System.out.println();
}
System.out.println(alphabet);

输出:

Input:
ABCAAAABBZZZZZ
*                        *
*                        *
**                       *
**                       *
***                      *
ABCDEFGHIJKLMNOPQRSTUVWXYZ

演示在这里:

Rextester

【讨论】:

    猜你喜欢
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 2012-02-17
    相关资源
    最近更新 更多