如何使用地图获取字符串中第二个最重复的Word

时间:2014-10-13 12:01:50

标签: java collections

我试图在句子中获得第二个重复的单词。

例如:

String paraString = "This is a paragraph with multiple strings. Get the second most repeated word from the paragraph text and print the words with count".

这里''重复三次和'段。 &安培; '与'重复两次。

我需要打印第二个重复的单词'段落' &安培; '与'

这是我为了获得第一个最重复的单词所写的程序。

public Set<String> getMostRepeatedWords(Map<String, Integer> sortedMap) {
    Set<String> mostRepeatedWords = new HashSet<String>();
    int mostrepeatedWord = Collections.max(sortedMap.values());
    for (Map.Entry<String, Integer> entry : sortedMap.entrySet()) {
        if (mostrepeatedWord == entry.getValue()) {
            mostRepeatedWords.add(entry.getKey());
        }
    }

    return mostRepeatedWords;
}

请帮帮我。

我有一个选项如下。如果还有其他方法,请告诉我。

int mostrepeatedWord = Collections.max(sortedMap.values())-1;

2 个答案:

答案 0 :(得分:1)

以下是使用Java 8可以执行的操作的示例:

public List<String> getMostRepeatedWords(String s) {
    Map<String,Integer> map = new HashMap<>();
    String[] words  = s.split("\\s+");
    for (String word : words) 
        map.put(word,map.containsKey(word) ? map.get(word) + 1 : 0);

    List<Entry<String,Integer>> tmp = new ArrayList<>(map.entrySet());
    Collections.sort(tmp,(e1,e2) -> Integer.compare(e2.getValue(),e1.getValue()));

    return tmp.stream().map(e -> e.getKey()).collect(Collectors.toList());
}

此方法计算通过减少出现次数排序的单词的完整列表。如果您不需要整个列表,则应该将地图的条目存储在数组中,然后使用自定义Comparator对其应用快速选择。如果您有兴趣,请告诉我,我会进一步了解详情。

答案 1 :(得分:0)

关注您的解决方案 所以你有getMostRepeatedWords,现在想要第二个重复的单词。 在伪代码中,这将是:

Map<String, Integer> sortedMap = ...;
SortedMap<String, Integer> rest = new TreeMap<>(sortedMap);
rest.removeAll(getMostRepeatedWords(sortedMap));
Set<String> secondMostRepeatedWords = getMostRepeatedWords(rest);

删除最重复的单词,然后在其余单词中删除最重复的单词。

更多努力 您还可以复制值,逐渐对它们进行排序,然后取第二个较小的值: 索引&gt; 0,值较小比第一个。