首页 > 代码库 > MapReduce实战(六)
MapReduce实战(六)
需求:
利用mapReduce实现类似微信好友中查找共同好友的功能。如下:
A:B,C,D,F,E,O
B:A,C,E,K
C:F,A,D,I
D:A,E,F,L
E:B,C,D,M,L
F:A,B,C,D,E,O,M
G:A,C,D,E,F
H:A,C,D,E,O
I:A,O
J:B,O
K:A,C,D
L:D,E,F
M:E,F,G
O:A,H,I,J
求出哪些人两两之间有共同好友,及他俩的共同好友都是谁。
比如:
A,B:[C,E]
分析:
在利用MapReduce程序解答之前,我们不妨用单机程序练习一下,思路很简单,可以利用两个for循环进行遍历,分别找之间的共同好友,如果有则存到list中,设一个map,key就是两个人的ID,value就是存的list,最后就能求得两个人之间的共同好友。程序如下:
package com.darrenchan.test; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class Test { public static void main(String[] args) throws Exception { FileInputStream fis = new FileInputStream(new File("data.txt")); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); String line = null; // 将文件中的内容存到list中 List<String> list = new ArrayList<String>(); while ((line = br.readLine()) != null) { list.add(line); } Map<String, List<String>> map = new LinkedHashMap<>(); // 对list进行处理 for (int i = 0; i < list.size(); i++) { for (int j = i + 1; j < list.size(); j++) { //临时的list,用于拼接最后结果中的共同好友 List<String> tempList = new ArrayList<>(); //按照":"进行分割 String keyi = list.get(i).split(":")[0]; String keyj = list.get(j).split(":")[0]; String contenti = list.get(i).split(":")[1]; String contentj = list.get(j).split(":")[1]; //让i层的每一个好友分别和j层的好友找共同好友 String[] fields = contenti.split(","); for (int k = 0; k < fields.length; k++) { if (contentj.contains(fields[k])) { tempList.add(fields[k]); } } // 如果tempList里面有内容说明就是有相同元素 if (tempList.size() > 0) { map.put(keyi + "," + keyj, tempList); } } } // 打印map for (String key : map.keySet()) { System.out.println(key + ":" + map.get(key)); } } }
求得结果:
A,B:[C, E]
A,C:[D, F]
A,D:[F, E]
A,E:[B, C, D]
A,F:[B, C, D, E, O]
A,G:[C, D, F, E]
A,H:[C, D, E, O]
A,I:[O]
A,J:[B, O]
A,K:[C, D]
A,L:[D, F, E]
A,M:[F, E]
B,C:[A]
B,D:[A, E]
B,E:[C]
B,F:[A, C, E]
B,G:[A, C, E]
B,H:[A, C, E]
B,I:[A]
B,K:[A, C]
B,L:[E]
B,M:[E]
B,O:[A]
C,D:[F, A]
C,E:[D]
C,F:[A, D]
C,G:[F, A, D]
C,H:[A, D]
C,I:[A]
C,K:[A, D]
C,L:[F, D]
C,M:[F]
C,O:[A, I]
D,E:[L]
D,F:[A, E]
D,G:[A, E, F]
D,H:[A, E]
D,I:[A]
D,K:[A]
D,L:[E, F]
D,M:[E, F]
D,O:[A]
E,F:[B, C, D, M]
E,G:[C, D]
E,H:[C, D]
E,J:[B]
E,K:[C, D]
E,L:[D]
F,G:[A, C, D, E]
F,H:[A, C, D, E, O]
F,I:[A, O]
F,J:[B, O]
F,K:[A, C, D]
F,L:[D, E]
F,M:[E]
F,O:[A]
G,H:[A, C, D, E]
G,I:[A]
G,K:[A, C, D]
G,L:[D, E, F]
G,M:[E, F]
G,O:[A]
H,I:[A, O]
H,J:[O]
H,K:[A, C, D]
H,L:[D, E]
H,M:[E]
H,O:[A]
I,J:[O]
I,K:[A]
I,O:[A]
K,L:[D]
K,O:[A]
L,M:[E, F]
接下来我们思考:如何用MapReduce的程序进行求解呢?
MapReduce实战(六)