在Java中是否存在像“Set”这样的对象,它只能包含唯一的字符串值,还包含字符串值出现次数的计数?
这个想法很简单
使用数据集ala ...
一个 乙 乙 C C ç
我想将每行文本添加到类似Set的对象中。每次将非唯一文本添加到集合中时,我还希望具有与集合关联的数值,以显示添加的次数。因此,如果我在上面的数据集上运行它,输出将类似于:
答:1 B:2 C:3
任何想法?
答案 0 :(得分:16)
你想要一个“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<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
Apache Collections的问题一般是它没有得到非常积极的维护,并且它还不支持Java Generics。为了进入这个差距,谷歌写了他们自己的Collections非常强大。请务必先评估Google Collections。
更新:Google Collections还提供了Multimap,一个“类似于Map的集合,但可以将多个值与一个键相关联”。
答案 1 :(得分: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);
}
}
答案 2 :(得分:2)
Yeap,不是直接在核心,但可以使用Map轻松构建。
这是一个天真的实现:
import java.util.Map;
import java.util.HashMap;
public class SetLike {
private Map<String, Integer> map = new HashMap<String,Integer>();
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等等,这取决于您想要什么以及您需要什么。
答案 3 :(得分:0)
这会有所帮助..
List<String> myList=new ArrayList<String>();
myList.add("A");
myList.add("B");
myList.add("B");
myList.add("C");
myList.add("C");
myList.add("C");
Set<String> set=new HashSet<String>(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