我一直在做一些事情,它需要一个字符流,形成单词,创建一个单词数组,然后创建一个包含每个唯一单词及其出现次数的向量(基本上是一个单词计数器)。
无论如何,我已经很长时间没有使用 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!!
作为第二个问题,这给了我一个所有单词按字母顺序排列的向量(如数组中)。我想让它按出现次数排序,其中的字母顺序。
最好的选择是:
向下迭代向量,用上面的一个测试每个出现的 int,
Collections.swap()
如果它更高,然后检查上面的下一个(因为它现在向上移动 1),依此类推,直到它不再大于它上面的任何东西。可以跳过任何出现的 1。再次向下迭代向量,针对向量的第一个元素测试每个元素,然后向下迭代,直到出现次数减少并将其插入该元素上方。将再次跳过所有出现的 1。
第一种方法在迭代元素方面做得更多,但第二种方法需要您添加和删除向量的组件(我认为?)所以我不知道哪个更有效,或者是否值得考虑。