5

我有以下代码来计算数组中不同字符串的实例;

String words[] = {"the","cat","in","the","hat"};
HashMap<String,Integer> wordCounts = new HashMap<String,Integer>(50,10);
for(String w : words) {
    Integer i = wordCounts.get(w);
    if(i == null) wordCounts.put(w, 1);
    else wordCounts.put(w, i + 1);
}

这是正确的做法吗?一个简单的任务似乎有点啰嗦。结果HashMap对我很有用,因为我将按字符串对其进行索引。

我担心线路

else wordCounts.put(w, i + 1);

可能会插入第二key-value对,因为

new Integer(i).equals(new Integer(i + 1));

会是假的,所以两个Integers最终会在同一个String密钥桶下,对吧?还是我只是过度思考自己陷入了困境?

4

6 回答 6

8

您的代码将起作用HashMultiset-但从Guava使用它会更简单。

// Note: prefer the below over "String words[]"
String[] words = {"the","cat","in","the","hat"};
Multiset<String> set = HashMultiset.create(Arrays.asList(words));

// Write out the counts...
for (Multiset.Entry<String> entry : set.entrySet()) {
    System.out.println(entry.getElement() + ": " + entry.getCount());
}
于 2012-10-31T17:33:05.937 回答
6

是的,您正在以正确的方式进行操作。如果提供了相同的键,HashMap 会替换值。

来自 Java 文档HashMap#put

将指定的值与此映射中的指定键相关联。如果映射先前包含键的映射,则替换旧值。

于 2012-10-31T17:31:43.977 回答
2

您的代码非常好。您将字符串映射到整数。没有任何东西是重复的。

于 2012-10-31T17:31:52.783 回答
2

HashMap 不允许重复,因此无法在您的映射中拥有多个 SAME 键值对。

于 2012-10-31T17:32:11.987 回答
0

这是一个特定于字符串的计数器,它应该被泛化并具有 toString() 的按值排序选项,但它是该问题的面向对象的包装器,因为我找不到类似的东西:

package com.phogit.util;

import java.util.Map;
import java.util.HashMap;

import java.lang.StringBuilder;

public class HashCount {

    private final Map<String, Integer> map = new HashMap<>();

    public void add(String s) {
        if (s == null) {
            return;
        }
        Integer i = map.get(s);
        if (i == null) {
            map.put(s, 1);
        } else {
            map.put(s, i+1);
        }
    }

    public int getCount(String s) {
        if (s == null) {
            return -1;
        }
        Integer i = map.get(s);
        if (i == null) {
            return -1;
        }
        return i;
    }

    public String toString() {
        if (map.size() == 0) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        // sort by key for now
        Map<String, Integer> m = new TreeMap<String, Integer>(map);
        for (Map.Entry pair : m.entrySet()) {
            sb.append("\t")
              .append(pair.getKey())
              .append(": ")
              .append(pair.getValue())
              .append("\n");;
        }
        return sb.toString();
    }

    public void clear() {
        map.clear();
    }
}
于 2015-09-03T21:45:30.270 回答
0

您的代码对我来说看起来不错,并且没有问题。由于 Java 8 的特性,它可以简化为:

String words[] = {"the","cat","in","the","hat"};
HashMap<String,Integer> wordCounts = new HashMap<String,Integer>(50,10);
for(String w : words) {
     wordCounts.merge(w, 1, (a, b) -> a + b);
}

以下代码

System.out.println("HASH MAP DUMP: " + wordCounts.toString());

会打印出来。

HASH MAP DUMP: {cat=1, hat=1, in=1, the=2}
于 2018-09-26T13:04:59.190 回答