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

时间:2009-12-04 21:42:45

标签: java data-structures

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

这个想法很简单

使用数据集ala ...

一个 乙 乙 C C ç

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

答:1 B:2 C:3

任何想法?

4 个答案:

答案 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