我必须创建一个单词计数器程序。这在逻辑上并不是很困难,但我正在处理接口。因此,首先,我必须创建一个实现定义接口的类:
public interface WordFrequency {
String getWord();
int getFrequency();
}
我必须创建另一个类,它实现了定义的另一个接口:
public interface WordFrequencyAnalyzer {
int calculateHighestFrequency(String text);
int calculateFrequencyForWord (String text, String word);
List<WordFrequency> calculateMostFrequentNWords (String text, int n);
}
现在,这个接口中的第三个方法返回前一个接口的列表。我会保持地图中单词的频率。此方法要求我返回给定文本中N个最高频率的单词。使用降序值对映射进行排序并相应地返回是非常容易的,但是如何用映射中的正确值创建这个特定接口的列表以返回所需的格式?
编辑:我使用Map<String,Integer> m = new HashMap<String,Integer>()
存储单词及其频率。这就是我需要存储在List<WordFrequency>
中并返回的内容。
发布于 2022-10-17 18:16:37
您可以将此示例视为用例的起点:
接口
public interface WordFrequency {
String getWord();
int getFrequency();
}
上述接口的实现
public class WordFreqImpl implements WordFrequency {
final String w;
final Integer f;
public WordFreqImpl(String word, Integer freq) {
w = word;
f = freq;
}
@Override
public String getWord() {
return w;
}
@Override
public int getFrequency() {
return f;
}
@Override
public String toString() {
return "" +
"w=" + w +
", f=" + f;
}
}
按照您的需求获取列表的演示
public class WordFreqDemo {
public static void main(String[] args) {
Map<String,Integer> m = new HashMap<>();
m.put("k1",1);
m.put("k2",2);
m.put("k3",3);
List<WordFrequency> wordFrequencyList = new ArrayList<>();
for (Map.Entry<String, Integer> entry: m.entrySet()) {
wordFrequencyList.add(new WordFreqImpl(entry.getKey(), entry.getValue()) {
});
}
for (WordFrequency w: wordFrequencyList) {
System.out.println(w);
}
// return wordFrequencyList as per use case
}
}
输出
w=k1, f=1
w=k2, f=2
w=k3, f=3
发布于 2022-10-17 18:13:40
简单地说,您必须有一个实现接口的具体对象。然后,可以将该对象添加到列表中,因为除了默认情况下的任何对象之外,它现在还将是一个WordFrequency对象。您还需要一个实现WordFrequencyAnalyzer接口的对象。
接口是一个契约,它保证实现该接口的任何对象都会有特定的行为。它抽象出实现,并允许对象具有更多的多态性。
这是一个很好的接口资源。
发布于 2022-10-17 18:29:50
仍然是一个答案,显示record
为ad数据类,以及Stream
-。
地图中的n
最高频率条目:
record Fr(String word, int frequency) implements WordFrequency {
@Override
public String getWord() {
return word;
}
@Override
public int getFrequency() {
return frequency;
}
}
Map<String,Integer> m = ...
List<WordFrequency> wfs = m.entrySet().stream()
.sorted(e -> Comparator.comparingInt(e.getValue()).reversed()
.thenComparing(e.getKey()))
.limit(n)
.map(e -> new Fr(e.getKey(), e.getValue())
.collect(Collectors.toList()):
https://stackoverflow.com/questions/74100934
复制相似问题