为什么我的地图值不正确?

时间:2014-03-11 00:13:09

标签: java map

    String a = "Some small sample text!";
    char[] letters = a.toCharArray();
    int[] charvals = new int[letters.length];
    for (int i = 0; i<letters.length;i++) {
        int curr = (int) letters[i];
        charvals[i] = curr;
       }
    HashMap<Character, Integer> lettermap = new HashMap<Character, Integer>();
    Character c;
    for (int i = 0; i<letters.length; i++) {
        c = letters[i];
        if (lettermap.containsKey(c)) {
            lettermap.put(c, lettermap.get(c) + 1); }
        else {
            lettermap.put(c, 1); }}
    for (int i = 0; i < charvals.length; i++) {
        if (charvals[i] !=32) {
        c = letters[i];
        System.out.println(lettermap.get(c));
    }

1 1 3 3 2 3 2 3 3 2 2 3 1 3 3 2 3 1 2 1

这是输出,横向用于空间问题。我应该只有3“3s”或出现3次或更多次的信件,但我得到9.有人可以告诉我为什么?

在输出的第3项上很容易看到。键是我的字符串中的'm',它是第一次出现在地图中但值是3而不是1.为什么会发生这种情况?

4 个答案:

答案 0 :(得分:2)

for (int i = 0; i < charvals.length; i++) {
    if (charvals[i] !=32) {
    c = letters[i];
    System.out.println(lettermap.get(c));
}

这会遍历原始字符串中的每个字符 - not unqued - 并在地图中打印出其计数。因此,如果字符串中有三个'c',它将打印三次'c'的计数(3)。

您可能希望迭代lettermap.entrySet()

答案 1 :(得分:2)

你的算法确实没问题,唯一的问题是在输出中。您正在使用输入字符串的单个字符并输出其计数,如下所示:

S o m e s m a l l s a m p l e t e x t  
1 1 3 3 2 3 2 3 3 2 2 3 1 3 3 2 3 1 2

请尝试使用lettermap.keySet()

for (Character c2 : lettermap.keySet()) {
    System.out.printf("%s - %s\n", c2, lettermap.get(c2));
}

答案 2 :(得分:0)

您的程序目前只输出字符串中字符的最终计数。

要打印一个运行总计,您可以在更改值后通过向第二个for循环添加print语句来打印Map中存在的值,如下所示:

for (int i = 0; i < letters.length; i++) {
    c = letters[i];
    if (lettermap.containsKey(c)) {
        lettermap.put(c, lettermap.get(c) + 1);
    } else {
        lettermap.put(c, 1);
    }
    System.out.print(lettermap.get(c) + " ");
}

这将打印以下输出:1 1 1 1 1 1 2 1 1 2 2 2 2 3 1 3 2 3 1 3 1 2 1

如果您再添加一些逻辑来打印正在计算的字符,则会返回以下内容:

{'S'=1, 'o'=1, 'm'=1, 'e'=1, ' '=1, 's'=1, 'm'=2, 'a'=1, 'l'=1, 'l'=2, ' '=2, 's'=2, 'a'=2, 'm'=3, 'p'=1, 'l'=3, 'e'=2, ' '=3, 't'=1, 'e'=3, 'x'=1, 't'=2, '!'=1}

答案 3 :(得分:0)

对于任何有兴趣的人,请留下这个:

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

public class CharacterCount {
    public static void main(String[] args) {
        print("Some small sample text!");
    }

    public static void print(String str) {
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();

        for (Character c : str.toCharArray()) {
            map.put(c, 1 + (map.containsKey(c) ? 1 : 0));
        }

        List<Character> cList = new ArrayList<Character>(map.keySet());
        Collections.sort(cList);

        for (Character c : cList) {
            System.out.printf("'%c' - %d%n", c, map.get(c));
        }
    }
}

打印

' ' - 2
'!' - 1
'S' - 1
'a' - 2
'e' - 2
'l' - 2
'm' - 2
'o' - 1
'p' - 1
's' - 2
't' - 2
'x' - 1