我剛開始學習 Streams,我有一項任務是對某個字串陣列中的所有單詞進行計數和排序。我已經將我的輸入決議為單詞,但我不知道如何使用流添加和更新條目。
有我的決議流:
Stream<String> stringStream = lines.stream().flatMap(s -> Arrays.stream(s.split("[^a-zA-Z] ")));
String[] parsed = stringStream.toArray(String[]::new);
我在沒有流的情況下完成了這個任務,就像這樣:
Map<String,WordStatistics> wordToFrequencyMap = new HashMap<>();
for (String line: lines) {
line=line.toLowerCase();
String[] mas = line.split("[^a-zA-Z] ");
for (String word:mas) {
if(word.length()>3) {
if (!wordToFrequencyMap.containsKey(word)) {
wordToFrequencyMap.put(word, new WordStatistics(word, 1));
} else {
WordStatistics tmp = wordToFrequencyMap.get(word);
tmp.setFreq(tmp.getFreq() 1);
}
}
}
}
WordStatistics 類:
public class WordStatistics implements Comparable<WordStatistics>{
private String word;
private int freq;
public WordStatistics(String word, int freq) {
this.word = word;
this.freq = freq;
}
public String getWord() {
return word;
}
public int getFreq() {
return freq;
}
public void setWord(String word) {
this.word = word;
}
public void setFreq(int freq) {
this.freq = freq;
}
@Override
public int compareTo(WordStatistics o) {
if(this.freq > o.freq)
return 1;
if(this.freq == o.freq)
{
return -this.word.compareTo(o.word);
}
return -1;
}
}
uj5u.com熱心網友回復:
一個簡單的方法是toMap()使用合并函式進行收集:
Map<String, WordStatistics> wordToFrequencyMap = lines.stream()
.map(s -> s.split("[^a-zA-Z] "))
.flatMap(Arrays::stream)
.collect(Collectors.toMap(w -> w, w -> new WordStatistics(w, 1), (ws1, ws2) -> {
ws1.setFreq(ws1.getFreq() ws2.getFreq());
return ws1;
}));
分解toMap()論點:
w -> w只是意味著使用流元素作為映射鍵。- 下一個引數為鍵生成一個值,它最初是
WordStatistics一個頻率為的新實體1。 - 最后,我們告訴收集器如何將屬于同一個鍵的值合并在一起。在我們的例子中,我們將頻率相加到值之一 (
ws1) 并將其作為合并結果回傳。
uj5u.com熱心網友回復:
這應該與您現在在回圈中所做的幾乎相同。
Pattern pattern = Pattern.compile("[^a-zA-Z] ");
lines.stream().flatMap(pattern::splitAsStream).filter(s -> s.length() > 3).forEach(s -> {
WordStatistics tmp = wordToFrequencyMap.get(s);
if (tmp == null) {
wordToFrequencyMap.put(s, new WordStatistics(word, 1));
} else {
tmp.setFreq(tmp.getFreq() 1);
}
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/350552.html
