[英]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.