题目背景
很多了解过大数据编程的基础的人都知道一个入门级程序:word count。
其计算思路是,将一串文本(一般都是英文文章),在java中表现出来就是一个字符串或者是一个文本(txt文件)。
该题是计算该字符串中相同单词的个数并打印出来。
java8解决方案
package org.feng.stream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* Created by Feng on 2019/10/4 14:58
* CurrentProject's name is java8
*/
public class WordCountDemo {
public static void main(String[] args) {
// 文件生成流
// 遍历每一个单词出现的次数(简单的使用空格切割)
// 读取txt文件;设置编码格式
try(Stream<String> lines = Files.lines(Paths.get("resources/hello.txt"), Charset.defaultCharset())){
// 将英文逗号、句号、感叹号全部替换为空格字符串
lines.map(str -> str.replaceAll("[,]|[.]|[!]"," "))
// 按照空格切割字符串
.flatMap(line -> Arrays.stream(line.split(" ")))
// 过滤掉包含的空字符串
.filter(str -> !"".equals(str))
// 使用String的toString方法,获取单词作为map的键;计算个数作为值
.collect(Collectors.groupingBy(String::toString, Collectors.counting()))
// 遍历Map<String, Integer>
.forEach((k,v)->{
System.out.println("k="+k+",v="+v);
});
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试文档txt
Hello everyone!
my name is feng jin song. I am come from xi'an, i like play pingpong and computer games.
Three month ago,i was leave my university life.
when i walked on the street, i always want see anyone who named xxx.
i also like java.
控制台输出
k=play,v=1
k=named,v=1
k=university,v=1
k=ago,v=1
k=xi'an,v=1
k=I,v=1
k=when,v=1
k=life,v=1
k=jin,v=1
k=see,v=1
k=computer,v=1
k=java,v=1
k=Hello,v=1
k=street,v=1
k=leave,v=1
k=and,v=1
k=feng,v=1
k=games,v=1
k=from,v=1
k=on,v=1
k=always,v=1
k=song,v=1
k=like,v=2
k=everyone,v=1
k=want,v=1
k=was,v=1
k=i,v=5
k=also,v=1
k=come,v=1
k=is,v=1
k=am,v=1
k=my,v=2
k=pingpong,v=1
k=Three,v=1
k=the,v=1
k=walked,v=1
k=month,v=1
k=anyone,v=1
k=name,v=1
k=xxx,v=1
k=who,v=1
Process finished with exit code 0
总结
这个程序而言,使用的是java8中的Stream接口和Collectors工具接口。他们的组合是很强大的。值得我们去学习。