java - 计算数组中单词的出现次数

标签 java arrays vector

我一直在研究一些东西,它采用字符流,形成单词,创建单词数组,然后创建一个 vector ,其中包含每个唯一的单词及其出现的次数(基本上是单词计数器)。

无论如何,说实话,我已经很长时间没有使用 Java 了,也没有使用过太多编程,而且我对目前的外观并不满意。我所拥有的使 vector 看起来很丑的部分,我想知道是否可以让它不那么困惑。

    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!!

作为第二个问题,这给了我一个 vector ,其中包含按字母顺序排列的所有单词(如数组中所示)。我想让它按出现次数排序,其中按字母顺序排列。

最好的选择是:

  • 向下迭代 vector ,使用 Collections.swap() 测试每个出现的 int 与上面的 int 。如果它更高,则检查上面的下一个(因为它现在向上移动了 1),依此类推,直到它不再比上面的任何东西大。任何出现的 1 都可以被跳过。

  • 再次向下迭代 vector ,根据 vector 的第一个元素测试每个元素,然后向下迭代,直到出现次数较低并将其插入到该元素上方。所有出现的 1 将再次被跳过。

第一种方法会在迭代元素方面做更多的事情,但第二种方法需要您添加和删除 vector 的组件(我认为?),所以我不知道哪种方法更有效,或者它是否更有效值得考虑。

最佳答案

为什么不使用 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 复制)

关于java - 计算数组中单词的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11506509/

相关文章:

java - 在 Maven 中包含 shiro-core 和 shiro-web 后出现错误

java - Spring bean定义: ArrayList of String array

Java 使用 XSL 将 XML 转换为 HTML

ios - 如何在 JSON 中循环数组 imageURL 以在 ImageView 中显示

c - 将 char 数组中的值传递给 c 中的 BoS 函数

C++:制作指针 vector 的完整拷贝

对象构造函数访问中对象的 C++ 静态 vector ?

java - 同步和并发集合如何是线程安全的,但它们的内容不是

java - 处理/Java 在播放列表中播放 WAV

c++ - 非方阵乘法帮助 C++