如何获得重复?

时间:2013-05-06 17:34:05

标签: java sorting

我有一个接收单词列表的方法。这些单词将根据字符串的hASHmap进行检查,该字符串具有String作为键,而Integer作为值。 String是一个单词,Integer表示文本文件中的单词频率。

目前,单词列表根据频率排列,将它们放入树形图中,频率成为关键。

但是,由于不存在重复键,因此Hashmap中具有相同频率值的任何单词都不会输入到Treemap中。

我可以做些什么才能拥有一个日期结构,其中包含按频率排列的单词,包括重复项?

   //given a list of words return a TreeMap of those words ranked by most frequent occurence
private TreeMap rankWords(LinkedList unrankedWords) {

    //treemap to automatically sort words by there frequency, making the frequency count the key.
    TreeMap<Integer, String> rankedWordsMap = new TreeMap<Integer, String>();

    //for each of the words unranked, find that word in the freqMap and add to rankedWords
    for (int i = 0; i < unrankedWords.size(); i++) {

        if (freqMap.containsKey((String) unrankedWords.get(i))) {

            rankedWordsMap.put(freqMap.get((String) unrankedWords.get(i)),
                    (String) unrankedWords.get(i));

        }

    }

    return rankedWordsMap;

}

6 个答案:

答案 0 :(得分:4)

您应该重新考虑您的数据结构,以便拥有唯一的密钥。听起来你的结构是倒置的:它应该是Map个字来计数,而不是相反,因为单词是唯一键,而计数是与键相关的值数据。

答案 1 :(得分:3)

我会从字符串到整数频率开始。

将entrySet()复制到List并按频率对其进行排序。

答案 2 :(得分:1)

你的过程有点破碎。 TreeMap的契约要求compareTo(...)调用的行为永远不会在TreeMap的生命周期中发生变化。换句话说,您无法更新更改排序顺序的因素(例如更改频率)。

我的建议是做两件事之一:

  • 使用两个阶段,一个用于计算字频率(用字键控),第二个阶段按照频率顺序对字进行排序
  • 创建自定义数据结构(可能是两个数组),为您管理动态性质。

如果表现不是很关键,我可能会选择第一个。否则,第二个选项看起来是一个很好的挑战

答案 3 :(得分:1)

列出条目并按条目值对它们进行排序。

List<Map.Entry<String, Integer>> results = new ArrayList<>();
results.addAll(freqMap.entrySet());
Collections.sort(new Comparator<Map.Entry<String, Integer>() {
    @Override
    public int compare(Map.Entry<String, Integer> lhs,
            Map.Entry<String, Integer> rhs) {
        int cmp = lhs.getValue() - rhs.getValue();
        if (cmp == 0) {
            cmp = lhs.getKey().compareTo(rhs.getKey());
        }
        return cmp;
    }
});

答案 4 :(得分:0)

不确定这是否是最优雅的解决方案,但是一旦您的频率图完成,您可以将每个地图条目转换为表示每个地图条目的对象:

class Entry {
  String word;
  int frequency;
}

然后你只需为该对象的频率/值编写一个比较器进行排序。

答案 5 :(得分:0)

您可以使用a Set作为TreeMap的值,这样您就可以执行以下操作,按频率将字词添加到地图

TreeMap<Integer, Set<String>> rankedWordsMap = new TreeMap<>();

// inside loop
String word = (String) unrankedWords.get(i);
int frequency = freqMap.get(word);
// get the set of words with the same frequency
Set<String> wordSet = rankedWordsMap.get(frequency);
// if not yet existen, create and put it into the map
if(wordSet == null) {
    wordSet = new HashSet<>();
    rankedWordsMap.put(frequency, wordSet);
}
// add the word to set of words
wordSet.add(word);

这样你就可以保留所有频率相同的单词。