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.为什么会发生这种情况?
答案 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