2016-10-30 121 views
1

我已經開始編程不久,我需要你的幫助。我有一個Object1的列表,一個Object1由Item1,Item2,Item3組成。使用Java映射值列表與另一個值列表8

我想通過Item2進行分組,將每個Item2與Object1的列表進行映射,然後使用 我想將Object1的每個List與Item3的List進行映射,最後我想要計算不同的Item3的數量在Item3的每個列表中。

說了一下,我想在Object1列表中計算每個Item2中Item3的數量。

要做到這一點,這裏是我迄今所做的:

Map<Item2, List<Object1>> object1GroupedByItem2 = object1List.stream().collect(Collectors.groupingBy(object1->object1.getItem2())); 

List<Entry<Item2, List<Object1>>> object1GroupedByItem2List = object1GroupedByItem2.entrySet().stream().collect(Collectors.toList()); 

Map<Item2, List<Item3>> item3GroupedByItem2 = object1GroupedByItem2List.stream().collect(Collectors.toMap(entry->entry.getKey(),entry->entry.getValue().stream().map(object1->object1.getItem3()).collect(Collectors.toList()))); 

List<Entry<Item2, List<Item3>>> item3GroupedByItem2List = item3GroupedByItem2.entrySet().stream().collect(Collectors.toList()); 

Map<Item2, List<Item3>> distinctItem3GroupedByItem2 = item3GroupedByItem2List.stream().collect(Collectors.toMap(entry->entry.getKey(),entry->entry.getValue().stream().distinct().collect(Collectors.toList()))); 

List<Entry<Item2, List<Item3>>> distinctItem3GroupedByItem2List = distinctItem3GroupedByItem2.entrySet().stream().collect(Collectors.toList()); 

Map<Item2, Long> nbItem3PerItem2 = distinctItem3GroupedByItem2List.stream().collect(Collectors.toMap(entry->entry.getKey(),entry->entry.getValue().stream().count()); 

我幾乎可以肯定,必須有一個更好的方式做同樣的,但我不知道如何.. 你能幫我嗎?

在此先感謝

編輯:

public class Object1 { 

    private Item1 item1; 
    private Item2 item2; 
    private Item3 item3; 

    public Object1(Item1 item1, Item2 item2, Item3 item3) { 
     this.item1 = item1; 
     this.item2 = item2; 
     this.item3 = item3; 
    } 

    public Item1 getItem1() { 
     return item1; 
    } 

    public void setItem1(Item1 item1) { 
     this.item1 = item1; 
    } 

    public Item2 getItem2() { 
     return item2; 
    } 

    public void setItem2(Item2 item2) { 
     this.item2 = item2; 
    } 

    public Item3 getItem3() { 
     return item3; 
    } 

    public void setItem3(Item3 item3) { 
     this.item3 = item3; 
    } 
} 

項目1,項目2和項目3只包裝的字符串。

至於條目列表,我該如何擺脫它們?我不需要他們來製作我的地圖嗎?

+0

你應該向我們展示類Object1,項目1,項目2和項目3的定義,使我們清楚地瞭解他們是如何相關在一起。你應該格式化你的代碼,使它可讀。 – Heri

+0

我會開始擺脫條目列表。那些根本就沒有必要。 –

+0

這看起來像一個設計噩夢,你通常不會使'x1','x2','x3',你創建對象的多個實例並將它們存儲在一個數組/集合中。命名也很重要,你選擇的名字是非常模棱兩可和混淆的(即使我自己試圖跟蹤我的頭) – Rogue

回答

0

這裏是回答我的問題:

Map<Item2, List<Object1>> object1GroupedByItem2 = object1List.stream().collect(Collectors.groupingBy(object1->object1.getItem2())); 

Map<Item2, Long> nbItem3PerItem2 = object1GroupedByItem2.entrySet().stream().collect(Collectors.toMap(entry->entry.getKey(), entry->entry.getValue().stream().map(object1->object.getItem3()).distinct().count()));            
相關問題