使用Java中的哈希表来计算字符的出现次数

时间:2015-08-18 17:28:02

标签: java collections hashmap hashtable

我正在尝试计算字符串中每个字符的出现次数。 所以,如果我输入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)));
}

6 个答案:

答案 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;
    }
}