2016-11-20 14 views
0

Supossed私は、息子のList属性(String)を持つ "Father"というJavaクラスを持っています。それはキーをすべての父親の名前とそのすべての息子の値であるMap<String, List<String>>を構築するのは簡単だろう。Java 8での問題によるグループ化

私はその逆を行う方法を知っています:Map<String, List<String>>キーはすべての息子に関連しており、値は彼の父親のリストです。息子が1人または2人の父親(父親&母親)に属している可能性があることを考慮してください。

私はこのコードを持っている: First Approach

をし、結果は次のとおりです。 Result

私が探していられる結果は、たとえば次のとおりです。 息子:マリア - 父:[マリアユージニア、エンリケ・アルベルト] 息子:Agustin - 父:[MaríaEugenia、Enrique Alberto]

+4

コードを画像ではなくテキストとして送信してください。 –

答えて

2

これをアプローチする1つの方法は、これを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'のストリームを取得するために、息子リストをマップに集める必要はありません。 – Holger

+0

あなたは単にペア(息子)の後にいるので、 '.flatMap(p - > p.sons.stream()。map(s - > new AbstractMap.SimpleImmutableEntry <>(s、p))) 、親)。中間のマップを使用して、変換がどのように行われているかを明確にすることにしました。 (標準ライブラリにペアがあってSimpleImmutableEntryのような厄介な構文を使わないようにするならば) –

関連する問題