关注
使用mapreduce的思想做了这周的题目,每个文件使用一个线程处理,最后的结果汇总到reduce,reduce把这些结果合并
用到的内容:多线程中不常用的一直方式Callable,正则表达式,HashMap排序,mapreduce思想
Callable可以获取线程执行完的结果,并且可以抛出异常
下面是代码
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.concurrent.Callable;
/**
* map部分
* @author Matrix42
*
*/
public class WorldCountMap implements Callable<HashMap<String, Integer>>{
//待处理的文本
private String text;
//待处理的文件
private File file;
//以单词为key,次数为value的结果
private HashMap<String, Integer> result;
public WorldCountMap(File file) {
this.file = file;
result = new HashMap<String, Integer>();
}
/**
* 把文件内容读出来存到text中
* @param file
* @return
*/
private String Transform(File file){
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
StringBuffer sb = new StringBuffer();
String string;
try {
while((string = reader.readLine())!=null){
sb.append(string);
}
} catch (IOException e) {
e.printStackTrace();
}
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
@Override
public HashMap<String, Integer> call() {
this.text = Transform(file);
//使用正则进行分割
String[] strings = text.split("[^\\w]|[\\d]");
for (String string : strings) {
//单词全部转换为小写的
string = string.toLowerCase();
//如果是空就跳过(正则分割时产生的)
if (string.equals("")) {
continue;
}
//把单词存入map,单词为key,如果之前不存在则value为1,存在则balue加1
if(result.containsKey(string)){
result.put(string, result.get(string)+1);
}else {
result.put(string, 1);
}
}
return result;
}
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* reduce部分
* @author Matrix42
*
*/
public class WorldCountReduce {
//存放map处理完的结果
private List<Map<String, Integer>> resultList;
//存放reduce处理完的结果
private HashMap<String, Integer> result;
//单例对象
private static WorldCountReduce instance;
//private的构造方法
private WorldCountReduce() {
this.resultList = new ArrayList<Map<String,Integer>>();
result = new HashMap<String, Integer>();
}
//获取单例对象的方法
public static WorldCountReduce getInstance(){
if(instance == null){
instance = new WorldCountReduce();
}
return instance;
}
//添加一个待reduce的结果
public void add(Map<String, Integer> res){
resultList.add(res);
}
//对map结果进行合并,处理方式与map类似
public void calculate(){
for (Map<String, Integer> map : resultList) {
for(Entry<String, Integer> entry:map.entrySet()){
String key = entry.getKey();
if(result.containsKey(key)){
result.put(key, result.get(key)+entry.getValue());
}else{
result.put(key, entry.getValue());
}
}
}
}
//返回reduce结果
public HashMap<String, Integer> getResult(){
return result;
}
}
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* 任务管理器,用户不用WorldCountMap和WorldCountReduce打交道
* @author Matrix42
*
*/
public class TaskManager {
private ArrayList<File> tasks;
private List<Future> taskList = new ArrayList<Future>();
private WorldCountReduce reduce;
private ExecutorService exec;
/**
* 构造方法,参数为待处理的文本的File对象
* @param tasks
*/
public TaskManager(ArrayList<File> tasks) {
this.tasks = tasks;
}
/**
* 添加一个待处理的文本的File对象
* @param file
*/
public void addTask(File file){
tasks.add(file);
}
/**
* 开始任务
* 多线程处理
*/
public void start(){
exec = Executors.newFixedThreadPool(tasks.size());
for(File task:tasks){
WorldCountMap mapTask = new WorldCountMap(task);
taskList.add(exec.submit(mapTask));
}
}
/**
* 结束任务
*/
public void shutdownTask(){
exec.shutdownNow();
}
/**
* 把map的结果传给reduce处理,然后返回最后结果
* @return
*/
public HashMap<String, Integer> getResult(){
reduce = WorldCountReduce.getInstance();
for(Future future:taskList){
try {
reduce.add((Map<String, Integer>) future.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
reduce.calculate();
return reduce.getResult();
}
}
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class Client {
public static void main(String[] args) {
//添加待处理的文件
ArrayList<File> tasks = new ArrayList<>();
tasks.add(new File("D:/a.txt"));
tasks.add(new File("D:/b.txt"));
tasks.add(new File("D:/c.txt"));
TaskManager manager = new TaskManager(tasks);
//开始任务
manager.start();
//获取结果
Map<String,Integer> resMap = manager.getResult();
List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(resMap.entrySet());
//按value排序
Collections.sort(list,new Comparator<Map.Entry<String,Integer>>() {
//降序排序
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
return o2.getValue().compareTo(o1.getValue());
}
});
//输出
for (Entry<String, Integer> e: list) {
System.out.println(e.getKey()+":"+e.getValue());
}
//结束任务
manager.shutdownTask();
}
}
正则有点捉急,在RegexBuddy和java中结果不一样
结果:
查看原帖
点赞 评论
相关推荐
查看8道真题和解析 点赞 评论 收藏
分享
05-18 11:04
广东海洋大学 前端工程师 点赞 评论 收藏
分享
查看15道真题和解析 点赞 评论 收藏
分享
牛客热帖
更多
- 1... 逆天老师,逆天领导,被我回怼一句话后破防了,要把我开除了5236
- 2... 作为一个老登,最烦应届生问的问题之一3930
- 3... 27双非ue游戏客户端大失败经历3594
- 4... 双非想拿腾讯offer,会被卡学历吗?3141
- 5... 各位都是怎么出去实习的3035
- 6... 26博士求职竟然也难2856
- 7... 三段大厂,说下我见过的最低学历2805
- 8... 理性讨论,卷实习算不算工贼行为?2665
- 9... 【5.21更新】26春招毁约毁意向裁员黑名单公司,为找工作尽一份绵薄之力!2533
- 10... 27 届秋招提前批可以开始投了!1726
正在热议
更多
# 如何成为1个AI工程师? #
6522次浏览 306人参与
# 秋招拿一个offer可以躺平吗 #
277540次浏览 1412人参与
# 26届春招投递记录 #
40353次浏览 350人参与
# 一人分享一个skill #
34638次浏览 317人参与
# 27届实习投递记录 #
127066次浏览 1434人参与
# 机械人求职现状 #
43989次浏览 329人参与
# 你觉得第一学历对求职有影响吗? #
276565次浏览 1494人参与
# 我在大厂见过的最低学历 #
5951次浏览 66人参与
# 产品2023笔面经 #
89169次浏览 472人参与
# 第一次找实习,我建议__ #
87401次浏览 875人参与
# 秋招白月光 #
819213次浏览 5694人参与
# 虹软科技求职进展汇总 #
18469次浏览 141人参与
# 想给25届机械人的秋招建议 #
54285次浏览 264人参与
# 上班苦还是上学苦呢? #
350573次浏览 2088人参与
# 给26届的秋招建议 #
391012次浏览 4407人参与
# 要毕业了,再不说就来不及了 #
11235次浏览 171人参与
# HR面都在聊什么? #
48501次浏览 333人参与
# 机械人你觉得今年行情怎么样? #
9799次浏览 100人参与
# 找工作中的意难平 #
1106051次浏览 6532人参与
# 运营来爆料 #
105935次浏览 519人参与