我正在尝试计算字符串中每个字符的出现次数。 所以,如果我输入aaabbbccc,我期待o / p为{a = 3,b = 3,c = 3},但我继续将其作为{a = 1,b = 1,c = 1},因为我的哈希表包含方法失败并返回false。代码有什么问题?
我也知道HashMap集合与hashtable非常相似。但是当我学习java时,我想尝试使用所有数据结构的相同代码,只是为了了解方法。带有map的代码与我在这里做的差别不大,但这段代码仍然失败。我无法弄清楚代码中的错误在哪里。
我有以下代码:
Hashtable<Character, Integer> stringHash = new Hashtable<Character, Integer>();
此stringHash是类级变量。
for(int i=0; i<s.length(); i++){
if(stringHash ==null || stringHash.size()==0){
stringHash.put(s.charAt(i), 1);
}
else{
if(! stringHash.contains(s.charAt(i)) ){
System.out.println(s.charAt(i));
stringHash.put(s.charAt(i), 1);
}
else{
int count = stringHash.get(s.charAt(i));
stringHash.put(s.charAt(i), count++);
}
}
System.out.println(stringHash + " " + s.charAt(i) + " "+ stringHash.contains(s.charAt(i)));
}
答案 0 :(得分:3)
此代码适用于我:
String s = "aaabbbccc";
Map<Character, Integer> stringHash = new HashMap<Character, Integer>();
for (char ch : s.toCharArray())
stringHash.put(ch, stringHash.containsKey(ch) ? (stringHash.get(ch) + 1) : 1);
System.out.println(stringHash);
// output: "{a=3, b=3, c=3}"
我使用Map<K, V>
代替HashTable<K, V>
,但这种情况更常见。
答案 1 :(得分:2)
尝试这样的事情....你的代码失败的原因是你正在检查HashTable上的contains()而不是它的keySet。希望有所帮助
public static void main(String[] args) {
// TODO Auto-generated method stub
String s = "aaaaabbcccc";
Hashtable<Character, Integer> counter = new Hashtable<Character, Integer>();
int count = 0;
for(int i=0;i<s.length();i++){
if(!counter.keySet().contains(s.charAt(i))){
counter.put(s.charAt(i), 1);
} else {
count = counter.get(s.charAt(i));
counter.put(s.charAt(i), ++count);
}
}
for(char c:counter.keySet()) {
System.out.println("Character : "+c+" - Occurences : "+counter.get(c));
}
}
O / P
Character : b - Occurences : 2
Character : c - Occurences : 4
Character : a - Occurences : 5
答案 2 :(得分:2)
您的代码
if(stringHash ==null || stringHash.size()==0){
stringHash.put(s.charAt(i), 1);
}
如果hashmap为null,将抛出NPE。幸运的是,您似乎已正确初始化它。该块应该是
if(stringHash ==null){
stringHash = new HashMap()
stringHash.put(s.charAt(i), 1);
}
同样,这不会修复你的错误。您应该使用containsKey
代替contains
来检查HashTable中的值。您要实现的内容可以通过以下伪代码进行总结。
initialize hashmap
for each character c in inputString
count = 0
if hashmap has a key for c
count = get value for c from hashmap
end if
put in to hashmap c, count + 1
end for
在Java中,这看起来像:
Map<Character, Integer> charCountMap = new HashMap<>();
for(char c : inputString.toCharArray()){
int count = 0;
if(charCountMap.containsKey(c)){
count = charCountMap.get(c);
}
charCountMap.put(c,count+1);
}
或者对于喜欢冒险的人来说,这里是 Java8 版本
Map<Character,Long> map = s.chars().mapToObj(i->(char)i)
.collect(Collectors
.groupingBy(e -> e,
Collectors.counting()));
System.out.println(map);
最后,不要使用 HashTable
它的遗留类,现在没有人会使用它。坚持使用HashMap或其他类型的Map实现。
答案 3 :(得分:0)
不鼓励调试我的代码问题,但是在解决字符串中字符计数的一般问题的方法中,我可以提出一个更简单的方法:
public static int[] countCharacters( String s ){
int[] count = new int[ 256 ];
for( int xChar = 0; xChar < s.length(); xChar++ ) count[ s.charAt( xChar ) ]++;
return count;
}
这假设您有单字节字符。
答案 4 :(得分:0)
为什么使用hashMap计算字符出现次数? 我会使用大小为255的整数数组,如下所示:
int[] counter = new int[256];
String s = "aaabbbcccc";
for(int i = 0; i < s.length(); i++){
counter[s.charAt(i)]++;
}
for(int i = 0; i < counter.length; i++)
if(counter[i] > 0)
System.out.println(((char)i) + " occurs " + counter[i] + " times");
coude会给出一个输出:
a occurs 3 times
b occurs 3 times
c occurs 4 times
答案 5 :(得分:0)
不要使用Hashtable,你可以大量简化代码,这样的事情应该有效:
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
public class Main {
public static void main(String[] args) {
Map<Character, Long> countMap = count("aabbbcccc");
for (Map.Entry<Character, Long> entry : countMap.entrySet()) {
System.out
.println(MessageFormat.format("Char ''{0}'' with count ''{1}''", entry.getKey(), entry.getValue()));
}
}
private static Map<Character, Long> count(String value) {
Map<Character, Long> countMap = new HashMap<Character, Long>();
if (StringUtils.isNotBlank(value)) {
for (int i = 0; i < value.length(); i++) {
Long count = countMap.get(value.charAt(i));
count = count == null ? 1 : count + 1;
countMap.put(value.charAt(i), count);
}
}
return countMap;
}
}