どのグループには、2つ以上のグループに属することができ、リストからオブジェクト?

Trillianの:

私は、各項目が1つまたは複数のカテゴリに属する​​ことができます項目のリストを持っています。カテゴリ(文字列)の限定セットのために私はキーと値などの項目のリストなどのカテゴリでマップを作成したいです。

以下のように私Itemクラスが定義されていると想定します。

public static class Item{
    long id;
    List<String> belongsToCategories;

    public List<String> getBelongsToCategories() {
        return belongsToCategories;
    }

    public void setBelongsToCategories(List<String> belongsToCategories) {
        this.belongsToCategories = belongsToCategories;
    }

    public Item(long id,List<String> belongsToCategories) {
        this.id = id;
        this.belongsToCategories = belongsToCategories;
    } 

    @Override
    public String toString() {
        return "Item{" + "id=" + id + '}';
    }        
}

そして項目のリスト:

public static void main(String[] args) {
    List<Item> myItemList   = new ArrayList<>();

    myItemList.add(new Item(1,Arrays.asList("A","B")));
    myItemList.add(new Item(2,Arrays.asList("A","C")));
    myItemList.add(new Item(3,Arrays.asList("B","C")));
    myItemList.add(new Item(4,Arrays.asList("D")));
    myItemList.add(new Item(5,Arrays.asList("D","E")));
    myItemList.add(new Item(6,Arrays.asList("A","F")));

    Map<String,List<Item>> myMap= new HashMap<>();

どのように私ははmyListからMYMAPを埋めることができますか?

私は、ストリームAPIは助けることができると思ったが、私は項目が1つのまたは複数のカテゴリに属する​​ことができたときにgroupingBy方法に入れるためにどの分類子かわかりません

 myItemList.stream().collect(Collectors.groupingBy(classifier));

この

myItemList.stream().collect(Collectors.groupingBy(Item::getBelongsToCategories));

生成

[D, E]=[Item{id=5}]
[B, C]=[Item{id=3}]
[A, B]=[Item{id=1}]
[D]=[Item{id=4}]
[A, C]=[Item{id=2}]
[A, F]=[Item{id=6}]

予想されるようなもの厳しいです。

A=[Item{id=1}, Item{id=2}, Item{id=6}]
B=[Item{id=1}, Item{id=3}]
C=[Item{id=2}, Item{id=3}]
D=[Item{id=4}, Item{id=5}]
E=[Item{id=5}]
F=[Item{id=6}]
また:

あなたは使用することができますflatMapにマッピングしSimpleEntry、その後、groupingByよう:

return items.stream()
        .flatMap(p -> p.getBelongsToCategories()
                .stream()
                .map(l -> new AbstractMap.SimpleEntry<>(l, p)))
        .collect(Collectors.groupingBy(Map.Entry::getKey,
                Collectors.mapping(Map.Entry::getValue,
                        Collectors.toList())));

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=173668&siteId=1