2016-11-20 30 views
0

Supossed我有一個名爲「Father」的Java類,其子類的List屬性(String)。建立一個:Map<String, List<String>>將是容易的,其中關鍵是所有父親的名字和他所有兒子的價值。在Java中分組問題8

我想知道如何做倒數:Map<String, List<String>>其中他們的鑰匙是關係到每一個兒子,價值是他的父親的名單。考慮到一個兒子可能屬於1或2個父親(父親&母親)。

我有這樣的代碼: First Approach

,其結果是: Result

我要尋找的結果是,例如: 兒子:瑪麗亞 - 父親:瑪麗亞·歐亨尼婭,恩裏克·阿爾貝託] 兒子:奧古斯丁 - 父親:[瑪麗亞尤金尼亞,恩裏克阿爾貝託]

+4

將您的代碼發佈爲文本,而不是圖片。 –

回答

2

所以一種方法來看待這是一個兩步操作。第一步是建立一對<Child, Parent>對,然後使用groupingBy將該流降至Map<Child,Parent>

static class Parent{ 
    String name; 
    List<Child> sons; 

    public Parent(final String name, final List<Child> sons) { 
     this.name = name; 
     this.sons = sons; 
    } 

    @Override 
    public String toString() { 
     return MoreObjects.toStringHelper(this) 
       .add("name", name) 
       .add("sons", sons) 
       .toString(); 
    } 
} 

static class Child{ 
    public Child(final String name) { 
     this.name = name; 
    } 

    String name; 


    @Override 
    public String toString() { 
     return MoreObjects.toStringHelper(this) 
       .add("name", name) 
       .toString(); 
    } 
} 

static void SonsToFathers(){ 
    Child c1 = new Child("aa"); 
    Child c2 = new Child("bb"); 

    List<Parent> parents = ImmutableList.of(
      new Parent("P1", ImmutableList.of(c1)), 
      new Parent("P2", ImmutableList.of(c1,c2)), 
      new Parent("P3", ImmutableList.of(c2))); 


    Map<Child,List<Parent>> childToParents = parents.stream() 
      .flatMap(p -> p.sons.stream() 
        .collect(Collectors.toMap(Function.identity(), s -> p)) 
        .entrySet() 
        .stream()) 
      .collect(Collectors.groupingBy(
        Map.Entry::getKey, 
        mapping(Map.Entry::getValue, toList()))); 


    System.out.println(childToParents); 
} 
+0

基因泰勒!你搖滾!...謝謝你的幫助...想深入java 8條流...下一次我將文本中的代碼發佈而不是在圖像中... Thankx ...我會更詳細地分析它現在... –

+0

您不需要將兒子列表收集到地圖中,只需要獲取「Map.Entry」流。你可以簡單地說'.flatMap(p - > p.sons.stream().map(s - > new AbstractMap.SimpleImmutableEntry <>(s,p)))' – Holger

+0

是的,因爲我們只是在對子之後,父母)。我決定使用中間的地圖來清楚地說明轉換是如何發生的。 (如果只有標準庫中有一對,那麼我們可以避免使用像SimpleImmutableEntry這樣的笨拙構造) –