我试图在句子中获得第二个重复的单词。
例如:
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;
答案 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,值较小比第一个。