java多标签分组

今天小同事问了一个多标签分组场景,感觉有点意思,遂用java写了一个分组方法,复杂度NxN;

1.分组方法;

    public static <T> Map<String, List<T>> multiTagClassify(List<T> list, Function<T, Set<String>> tagsExtractor) {
        Map<String, List<T>> resultMap = Maps.newHashMap();
        for (T t : list) {
            Set<String> 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<String> tags = Sets.newHashSet();
}

3.测试方法;

public class Test {

    public static void main(String[] args) {

        Map<String, List<Entity>> 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<Entity> 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 <T> Map<String, List<T>> multiTagClassify(List<T> list, Function<T, Set<String>> tagsExtractor) {
        Map<String, List<T>> resultMap = Maps.newHashMap();
        for (T t : list) {
            Set<String> 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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。