卡在了HashMap Collection的实现上

时间:2017-04-15 11:34:44

标签: java collections hashmap

Question:

要求用户输入字符串并使用Map集合计算字母和数字的次数。如果遇到任何其他字符,请使用星号*在控制台上显示。

实施例: 输入字符串:aaaabbbcccddd1112233 ^^^ 输出格式:*(3),1(3),2(2),3(2),a(4),b(3),c(3),d(3)(注:字符(次数) ))

我很难在控制台上显示星号,同时输入其他字符。谁能给我一些提示?

   import java.util.HashMap;
    import java.util.Map;
    import java.util.Scanner;
    import java.util.Set;

    public class Test5 {

        public static void main(String[] args) {
            //Scanner Input
            Scanner sc = new Scanner(System.in);
            System.out.println("Give me a String: ");
            String line = sc.nextLine();

            //String -> charArray
            char[] array = line.toCharArray();

            //create HashMap object
            HashMap<Character,Integer> hm = new HashMap<>();


            //Travese the array and put it in HashMap
            for(Character c : array) {
                if(!hm.containsKey(c)) {
                    if(c == 97) {
                        hm.put(c, 1);
                    }

                } else  {
                    hm.put(c, hm.get(c) + 1);
                } 
            }

            //get the key 
            Set<Character> key = hm.keySet();

            //print
            for(Character ch: key) {
                System.out.println(ch + "(" + hm.get(ch) + ")");
            }



        }

    }

3 个答案:

答案 0 :(得分:2)

这是一个从国际上有效的Imus中剔除的答案。

国际化通过获取角色的“Unicode类别”并检查它是否为字母或十进制数字来起作用。

此代码适用于大多数生活语言,并将通过大多数组织的国际化标准。

public static void main(String[] args) {
    String inputString = "Non-naïve code handles ß 1234";

    Map<Character, Integer> map = new HashMap<>();

    for (char c : inputString.toCharArray()) {
        int type=Character.getType(c);
        if (type!=Character.UPPERCASE_LETTER && 
            type!=Character.LOWERCASE_LETTER &&
            type!=Character.DECIMAL_DIGIT_NUMBER
        ) {
            c = '*';
        }
        map.put(c, map.getOrDefault(c, 0) + 1);
    }

    for (Character ch : map.keySet()) {
        System.out.println(ch + "(" + map.get(ch) + ")");
    }
}

检查某些内容是否为字母的另一种方法是Character.isLetter(c),但这可能包括您不认为是可能会或可能不会(通常不会)成为问题的字母。

我发布这个是因为Java的一个重要特性是它对Unicode有本机支持,但有太多的程序员不理解它。 我已经在所谓的国际组织中看到过多代码,这些代码无法处理ASCII之外的任何事情。无法接受顾客的名字是HelmutMaaß。

Java只对Unicode基本多语言平面提供了很好的支持。虽然如上所述支持大多数生活语言!

如果你想要使用完整的Unicode,你会得到以下的shizzle。 它必须在'代码点'中工作,因为一些Unicode“字符”不能用单个Java字符表示。

public static void main(String[] args) {
    int MYSTERY=28;//Hmmmm....
    String inputString = "\ud83d\ude00\ud83d\ude0e\ud83d\ude0f\ud83d\ude4c\ud83d\ude40";
    Map<Integer, Integer> map = new HashMap<>();//Not from Character. We need an integer to store code-points.

    for (int i=0;i<inputString.length();) {
        int cp=inputString.codePointAt(i);//May read 2 characters to identify a code-point in a supplementary plane.
        int type=Character.getType(cp);//Works fine. Overloaded to handle code-points.
        int c;//We need to remember the original code-point for later...
        if (type!=Character.UPPERCASE_LETTER && 
            type!=Character.LOWERCASE_LETTER &&
            type!=Character.DECIMAL_DIGIT_NUMBER &&
            type!=MYSTERY //Whaaat???
        ) {
            System.out.println(type);
            c = '*';
        }else{
            c=cp;
        }
        map.put(c, map.getOrDefault(c, 0) + 1);
        i+=Character.charCount(cp);//If we used 2 characters move on 2 or otherwise 1.
    }

    for (HashMap.Entry<Integer,Integer> curr : map.entrySet()) {
        System.out.print(Character.toChars(curr.getKey()));//Gets us back to characters from code-points...
        System.out.print("(" + curr.getValue() + ")");
    }
}

我建议,这对家庭作业来说太过分了。 这里发生的事情是Unicode的基本多语言平面之外的字符必须表示为32位整数而不是Java的16位本机字符。

答案 1 :(得分:1)

private static boolean isLetterOrDigit(char c) {
    return (c >= 'a' && c <= 'z') ||
            (c >= 'A' && c <= 'Z') ||
            (c >= '0' && c <= '9');
}

public static void main(String[] args) {
    String inputString = "blabla!!123";

    Map<Character, Integer> map = new HashMap<>();

    for (char c : inputString.toCharArray()) {
        if (!isLetterOrDigit(c)) {
            c = '*';
        }
        map.put(c, map.getOrDefault(c, 0) + 1);
    }

    for (Character ch : map.keySet()) {
        System.out.println(ch + "(" + map.get(ch) + ")");
    }
}

轻松奖励:如果用TreeMap替换HashMap,您的输出也会被排序。

Map<Character, Integer> map = new TreeMap<>();

答案 2 :(得分:0)

final String lowerLetters = "abcdefghijklmnopqrstuvwxyz";
final String upperLetters = lowerLetters.toUpperCase();
final String digits = "0123456789";
final String lettersDigits = lowerLetters + upperLetters + digits;

String line = sc.nextLine();

Map<Character,Integer> map = new HashMap<>();
for (char c : line.toCharArray()) {
    if (lettersDigits.indexOf(c) == -1) {
        c = '*';
    }
    Integer count = map.get(c);
    if (count == null) {
        count = 0;
    }
    map.put(c,++count);
}

for(Entry<Character,Integer> e : map.entrySet()) {
    System.out.println(e.getKey() + "(" + e.getValue() + ")");
}