在java中的字符串下打印星号(*)

时间:2015-10-02 15:24:03

标签: java string collections hashmap

我在接受采访时得到了一个java问题。在字符串中打印不同的字符,并在每个字符下打印星号(*),显示字符在该字符串中重复的次数。

例如:我的字符串是“GOOGLE”,那么输出应该是

G O L E
* * * *
* *

我在java中尝试过,我能够创建一个HashMap,它将存储字符串中的字符和重复次数。但是HashMap不是基于字符串的Insertion顺序。我也不知道下一步应该是什么。有人能帮我吗?提前致谢

public void myFunction(String str) {
    int length = str.length();
    HashMap<Character, Integer> hm = new HashMap<>();
    for(int i=0;i<length;i++){
        char ch = str.charAt(i);
        if(hm.containsKey(ch)){
            hm.put(ch, hm.get(ch)+1);               
        }
        else {
            hm.put(ch, 1);
        }


    }
        System.out.println(hm);
}

OUTPUT - Enter a String: 
GOOGLE
{E=1, G=2, L=1, O=2}

2 个答案:

答案 0 :(得分:3)

如果您使用LinkedHashMap,它将保留插入的顺序。你可以做这样的事情。还要添加max变量,因为我们稍后会在打印时需要它。

String input = "GOOGLE";
int max = 0;
LinkedHashMap<Character, Integer> map = new LinkedHashMap<>();
for (char c: input.toCharArray()){
    if (map.containsKey(c)){
        map.put(c, map.get(c) + 1);
    }else{
        map.put(c, 1);
    }
    max = Math.max(max, map.get(c));
}
System.out.println(map);

输出:

{G=2, O=2, L=1, E=1}

然后迭代你需要打印多少行并迭代每个字符。这样的事情应该可以解决问题。

for (int i=0; i<=max; i++){
    for (char c: map.keySet()){
        if (i==0){
            System.out.print(c);
        }else if (i<= map.get(c)){
            System.out.print("*");
        }else{
            System.out.print(" ");
        }
    }
    System.out.println();
}

输出:

GOLE
****
** 

答案 1 :(得分:0)

这是一个好的开始。

接下来我要做的是将HashMap更改为LinkedHashMap,以便我们可以维护字符的顺序并添加long以了解最大次数a角色出现。因此,我会将您当前的代码更改为:

public void myFunction(String str) {
int length = str.length();
long maxOcurrences = 0;
LinkedHashMap<Character, Integer> hm = new LinkedHashMap<>();
for(int i=0;i<length;i++){
    char ch = str.charAt(i);
    long nextValue;
    if(hm.containsKey(ch)){
        nextValue = hm.get(ch)+1
        hm.put(ch, nextValue);               
    }
    else {
        nextValue = 1;
        hm.put(ch, nextValue);
    }

    if(nextValue > maxOcurrences)
    {maxOcurrences = nextValue;}


}
    System.out.println(hm);
}

接下来,我将通过迭代LinkedHashMap按顺序打印字符。类似的东西:

for (Map.Entry<Character, Integer> entry : hm.entrySet()) {
    System.out.print(entry.getKey());
}
System.out.println();

最后,我会创建一个迭代maxOcurrences次的循环,并根据需要打印*

for(int i = 0; i < maxOcurrences; i++)
{
    //Iterate over each character again
    for (Map.Entry<Character, Integer> entry : hm.entrySet()) {
        if(entry.getValue() > i)
        {
            //Print Star
            System.out.print("*");
        }else{
            //Print space
            System.out.print(" ");
        }
        System.out.println();
    }
}