簡體   English   中英

計算數組中單詞的出現

[英]Counting occurrences of words in an array

我一直在研究一些需要處理的字符,這些字符組成單詞,形成單詞數組,然后創建一個向量,其中包含每個唯一的單詞及其出現的次數(基本上是一個單詞計數器)。

無論如何,我已經很久沒有使用Java了,或者說實話很多編程都沒有,我對當前的外觀不滿意。 我擁有的使矢量對我來說看起來很難看的部分,我想知道是否可以使它不那么混亂。

    int counter = 1;
    Vector<Pair<String, Integer>> finalList = new Vector<Pair<String, Integer>>();
    Pair<String, Integer> wordAndCount = new Pair<String, Integer>(wordList.get(1), counter); // wordList contains " " as first word, starting at wordList.get(1) skips it.

    for(int i= 1; i<wordList.size();i++){
        if(wordAndCount.getLeft().equals(wordList.get(i))){
            wordAndCount = new Pair<String, Integer>(wordList.get(i), counter++);
        }
        else if(!wordAndCount.getLeft().equals(wordList.get(i))){
            finalList.add(wordAndCount);
            wordAndCount = new Pair<String, Integer>(wordList.get(i), counter=1);
        }
    }
    finalList.add(wordAndCount); //UGLY!!

作為第二個問題,這給了我一個向量,所有單詞都按字母順序排列(如數組中一樣)。 我想按出現順序(在其中按字母順序)進行排序。

最好的選擇是:

  • 向下遍歷向量,使用Collections.swap()將其與上面的一個進行比較,測試每個出現的int是否更高,然后檢查上面的下一個(因為它現在已向上移動1),依此類推,直到不再大於上面的任何一個它。 任何出現的1都可以跳過。

  • 再次迭代向量,將每個元素相對於向量的第一個元素進行測試,然后向下迭代直到出現次數減少,然后將其插入到該元素之上。 所有出現的1將再次被跳過。

第一種方法在迭代元素方面會做更多的事情,但是第二種方法需要您添加和刪除向量的分量(我認為嗎?),所以我不知道哪種效率更高,或者它是否值得考慮。

為什么不使用Map來解決您的問題?

String[] words // your incoming array of words.
Map<String, Integer> wordMap = new HashMap<String, Integer>();
for(String word : words) {
  if(!wordMap.containsKey(word))
    wordMap.put(word, 1);
  else
    wordMap.put(word, wordMap.get(word) + 1);
}    

可以使用Java的排序集合來進行排序:

SortedMap<Integer, SortedSet<String>> sortedMap = new TreeMap<Integer, SortedSet<String>>();
for(Entry<String, Integer> entry : wordMap.entrySet()) {
  if(!sortedMap.containsKey(entry.getValue()))
    sortedMap.put(entry.getValue(), new TreeSet<String>());

  sortedMap.get(entry.getValue()).add(entry.getKey());
}

如今,您應該將排序留給該語言的庫。 多年來,它們被證明是正確的。

請注意,由於涉及到所有數據結構,因此代碼可能會占用大量內存,但這就是我們為高級編程所付出的代價(內存每秒鍾變得越來越便宜)。

我沒有運行代碼來查看它是否有效,但是它確實可以編譯(直接從eclipse復制)

關於:排序,一種選擇是編寫自定義Comparator ,該Comparator器首先檢查每個單詞出現的次數,然后(如果相等)按字母順序比較單詞。

private final class PairComparator implements Comparator<Pair<String, Integer>> {
    public int compareTo(<Pair<String, Integer>> p1, <Pair<String, Integer>> p2) {
        /* compare by Integer */
        /* compare by String, if necessary */
        /* return a negative number, a positive number, or 0 as appropriate */
    }
}

然后,您finalList通過調用Collections.sort(finalList, new PairComparator());finalList進行排序Collections.sort(finalList, new PairComparator());

如何使用Google番石榴庫?

   Multiset<String> multiset = HashMultiset.create();
   for (String word : words) {
       multiset.add(word);
   }

   int countFoo = multiset.count("foo");

從他們的javadocs:

一個支持與順序無關的相等的集合,例如Set,但可能具有重復的元素。 多重集合有時也稱為袋。

很簡單?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM