今天小同事问了一个多标签分组场景,感觉有点意思,遂用java写了一个分组方法,复杂度NxN;
1.分组方法;
public static Map> multiTagClassify(List list, Function> tagsExtractor) {
Map> resultMap = Maps.newHashMap();
for (T t : list) {
Set tags = tagsExtractor.apply(t);
for (String tag : tags) {
if (resultMap.containsKey(tag)) resultMap.get(tag).add(t);
else resultMap.put(tag, Lists.newArrayList(t));
}
}
return resultMap;
}
2.测试用实体;
import com.google.common.collect.Sets;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.Set;
@Data
@AllArgsConstructor
public class Entity {
private String name;
private Set tags = Sets.newHashSet();
}
3.测试方法;
public class Test {
public static void main(String[] args) {
Map> resultMap = multiTagClassify(mockTestData(), Entity::getTags);
for (String s : resultMap.keySet()) {
String names = resultMap.get(s).stream().map(x -> x.getName()).collect(Collectors.joining(","));
System.out.println("tag:" + s + " -->" + names);
}
}
public static List mockTestData() {
Entity entity1 = new Entity("a", Sets.newHashSet("ta"));
Entity entity2 = new Entity("b", Sets.newHashSet("ta", "tb"));
Entity entity3 = new Entity("c", Sets.newHashSet("ta", "tb", "tc"));
return Lists.newArrayList(entity1, entity2, entity3);
}
public static Map> multiTagClassify(List list, Function> tagsExtractor) {
Map> resultMap = Maps.newHashMap();
for (T t : list) {
Set tags = tagsExtractor.apply(t);
for (String tag : tags) {
if (resultMap.containsKey(tag)) resultMap.get(tag).add(t);
else resultMap.put(tag, Lists.newArrayList(t));
}
}
return resultMap;
}
}
4.测试结果;
image.png