是否存在像"Set"这样的对象,它只能包含唯一的字符串值,还包含字符串值出现次数的计数?

roc*_*kit 1 java data-structures

在Java中是否存在像"Set"这样的对象,它只能包含唯一的字符串值,还包含字符串值出现次数的计数?

这个想法很简单

有了数据集ala ...

A B B C C C.

我想将每行文本添加到类似Set的对象中.每次将非唯一文本添加到集合中时,我还希望具有与集合关联的数值,以显示添加的次数.因此,如果我在上面的数据集上运行它,输出将是这样的:

答:1 B:2 C:3

有任何想法吗?

Jim*_*ans 16

你需要一个"Bag",比如Apache Commons Collections中的Bag或Google Collections中的Multiset.您可以多次向其添加相同的值,它将记录每个值的计数.然后,您可以查询计数.

你会做这样的事与Apache的百科全书:

Bag myBag = new HashBag();
myBag.add("Orange");
myBag.add("Apple", 4);
myBag.add("Apple");
myBag.remove("Apple", 2);
int apples = myBag.getCount("Apple");  // Should be 3.
int kumquats = myBag.getCount("Kumquat"); // Should be 0.
Run Code Online (Sandbox Code Playgroud)

这与Google Collections的Multiset有关.

Multiset<String> myMultiset= HashMultiset.create();
myMultiset.add("Orange");
myMultiset.add("Apple", 4);
myMultiset.add("Apple");
myMultiset.remove("Apple", 2);
int apples = myMultiset.count("Apple");  // 3
int kumquats = myMultiset.count("Kumquats");  // 0
Run Code Online (Sandbox Code Playgroud)

Apache Collections的问题一般是它没有得到非常积极的维护,它还不支持Java Generics.为了进入这个差距,谷歌编写了他们自己的收藏品,这些收藏品非常强大.请务必先评估Google Collections.

更新:Google Collections还提供Multimap,一个"类似于地图的集合,但可以将多个值与一个键相关联".

  • 为什么甚至提到`Bag`和Apache Collections?一般而言,Google Collections及其"Multiset"在各个方面都更好. (4认同)

Esk*_*sko 10

Map<String, Integer>这将是最好的选择,用词来表达你想要做的是映射一个字符串的出现次数.基本上有类似这样的东西:

public void add(String s) {
    if (map.containsKey(s)) {
        map.put(s, map.get(s) + 1);
    } else {
        map.put(s, 1);
    }
}
Run Code Online (Sandbox Code Playgroud)