在向量中存储唯一元素并计算重复数

时间:2014-02-19 17:23:25

标签: java vector

我有一个单词的向量,但我想按字母顺序重新排列(在相同的向量中或新的单词中),并跟踪每个单词在文本中出现的次数。
这是我将单词存储到向量中的方式:

Vector<String> elements = new Vector<String>();

    int i = 0;

    // read infile line by line
    while ((line = infile.readLine()) != null)
    {

        String word;

        StringTokenizer linesplit = new StringTokenizer(line, " ,.-");
        while (linesplit.hasMoreElements()){
            word = linesplit.nextElement().toString() ;

            elements.add(i,(word));
            i++;
        }  
    }

要跟踪每个单词出现的次数,我想使用计数器:

public class Entry // implements Comparable<Entry>
    {
   private String word;
   private int counter;
    }

如何在当前矢量中检查一个单词是否出现多次,并按字母顺序重新排列单词?

2 个答案:

答案 0 :(得分:0)

您可以使用VectorCollections.sort(vector)进行排序。

为了存储每个令牌的出现次数,我建议使用HashMap<String, Integer>,因为它具有持续的访问时间,如果已经使用map.containsKey()已经存储了值,您可以轻松检查。然后,您只需迭代向量并计算每个标记的出现次数。

答案 1 :(得分:0)

@Warload有一个好主意,但是如果你使用SortedMap<String, Integer>,那么你将能够同时完成两个目标(对事件进行排序和计数)。

它可能看起来像这样

SortedMap<String, Integer> map = new TreeMap<String, Integer>();
// read infile line by line
while ((line = infile.readLine()) != null)
{

    String word;

    StringTokenizer linesplit = new StringTokenizer(line, " ,.-");
    while (linesplit.hasMoreElements()){
        word = linesplit.nextElement().toString() ;

        if (map.containsValue(word)) {
            int i = map.get(word);
            map.put(word, ++i);
        }
        else {
            map.put(word, 1);
        }
    }  
}


//some time later
Set<String> words = map.keySet();
Collection<Integer> counts = map.values();