java多標簽分組

今天小同事問了一個多標簽分組場景,感覺有點意思,遂用java寫了一個分組方法,復(fù)雜度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.測試結(jié)果;

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容