是否存在像“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