思想
三种写法都是先按照一定的规则进行字符串的切分,然后将其统计起来。
代码
package org.feng.java8;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
*
* 统计单词个数练习
* @author Feng
* @date 2020/10/6 13:44
*/
public class WordCountDemo {
/**正则匹配:(1-n个)空格、英文逗号、英文句号*/
private static Pattern pattern = Pattern.compile("[,.]| +");
/**
* 方法1
* @param line
* @param map
* @return
*/
public static Map<String, Integer> method1(String line, Map<String, Integer> map){
String[] words = pattern.split(line);
for (String word : words) {
map.merge(word, 1, (theOriginal, present) -> theOriginal + 1);
}
return map;
}
/**
* 方法2
* @param line
* @return
*/
public static Map<String, Long> method2(String line){
return pattern.splitAsStream(line)
.collect(Collectors.groupingBy(word -> word, Collectors.counting()));
}
/**
* 方法3
* @param line
* @return
*/
public static Map<String, Integer> method3(String line){
String[] words = pattern.split(line);
Map<String, Integer> result = new HashMap<>(16);
for (String word : words) {
result.put(word, result.getOrDefault(word, 0) + 1);
}
return result;
}
/**
* 测试运行
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
Map<String, Integer> map = new HashMap<>(16);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
StringBuilder sb = new StringBuilder();
while((line = br.readLine()) != null && !"bye".equals(line)){
sb.append(line);
}
// 输出结果
// System.out.println(method1(sb.toString(), map));
//System.out.println(method2(sb.toString()));
//System.out.println(method3(sb.toString()));
}
}