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

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

这个想法很简单

有了数据集ala …

A B B C C C.

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

答:1 B:2 C:3

有任何想法吗?

Map将是最好的选择,输入你要做的事情就是映射一个字符串的出现次数 。 基本上有这样的事情:

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

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

你可以用Apache Commons’Bag做这样的事情:

 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. 

这与Google Collections的Multiset有关 。

 Multiset 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 

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

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

Yeap,不是直接在核心,但可以使用Map轻松构建。

这是一个天真的实现:

 import java.util.Map; import java.util.HashMap; public class SetLike { private Map map = new HashMap(); public void add( String s ) { if( !map.containsKey( s ) ){ map.put( s, 0 ); } map.put( s, map.get( s ) + 1 ); } public void printValuesAndCounts() { System.out.println( map ); } public static void main( String [] args ){ String [] data = {"A","B","B","C","C","C"}; SetLike holder = new SetLike(); for( String value : data ) { holder.add( value ); } holder.printValuesAndCounts(); } } 

测试一下

 $ javac SetLike.java $ java SetLike {A=1, C=3, B=2} 

当然,你可以进一步改进它。 您可以实现Set接口,List或Collection等,您可以添加迭代器,实现Iterable等等,这取决于您想要什么以及您需要什么。

这将有所帮助..

  List myList=new ArrayList(); myList.add("A"); myList.add("B"); myList.add("B"); myList.add("C"); myList.add("C"); myList.add("C"); Set set=new HashSet(myList); for (String value : set) { int occurance=Collections.frequency(myList, value); System.out.println(value +" occur "+occurance + " times "); } 

结果:

  A occur 1 times B occur 2 times C occur 3 times