Skip to content

Instantly share code, notes, and snippets.

@adam-singer
Created January 22, 2013 02:25
Show Gist options
  • Save adam-singer/4591552 to your computer and use it in GitHub Desktop.
Save adam-singer/4591552 to your computer and use it in GitHub Desktop.
Map reduce example in dart
String sortedKey(List couple) {
couple.sort();
return Strings.concatAll(couple);
}
List mapper(Map m) {
var res = [];
for (var person in m.keys) {
var friends = m[person];
for (var friend in friends) {
String key = sortedKey([person, friend]);
res.add({'$key': friends});
}
}
return res;
}
List intersect(List lists) {
var intersections = [];
if (lists.length > 1) {
for (var f in lists[1]) {
if (lists[0].contains(f)) {
intersections.add(f);
}
}
}
return intersections;
}
Map reducer(String intermediate_key, List intermediate_value_list) {
Map intersection = {};
intersection[intermediate_key] = intersect(intermediate_value_list);
return intersection;
}
void main() {
Map m = {'A': ['B','C','D'],
'B': ['A','C','D','E'],
'C': ['A','B','D','E'],
'D': ['A','B','C','E'],
'E': ['B','C','D']};
var intermediate = mapper(m);
var groups = {};
var group = new Set.from(intermediate.map((v)=>v.keys[0]));
for (var g in group) {
var items = intermediate.filter((v)=> v.keys[0] == g);
groups[g] = [];
for (Map i in items) {
groups[g].addAll(i.values);
}
}
List reducer_res = [];
for (var intermediate_key in group) {
reducer_res.add(reducer(intermediate_key, groups[intermediate_key]));
}
// sort the results;
reducer_res.sort((a, b) => a.keys[0].compareTo(b.keys[0]));
for (var friendship in reducer_res) {
print("${friendship.keys[0][0]} & ${friendship.keys[0][1]} have ${friendship[friendship.keys[0]]} as common friends ");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment