2016-05-15 5 views
0

私はオブジェクトのリストを持っている、のは フラット化リストによるLambdajグループ

public class Model { 

String modelId; 

List<String> PropertyA; 
List<String> PropertyB; 
List<String> PropertyC; 

String modelCol1; 
String modelCol2; 
String modelCol3; 
String modelCol4; 

} 
モデル

サンプル・データを、それを呼びましょう複数のフィールドでグループ化する

"A", "7", "00111", [{1, ["A","C"], ["7", "8"], ["00111", "00112"], "colA1", "colA2", "colA3", "colA4"}] 

"A", "7", "00112", [{1, ["A","C"], ["7", "8"], ["00111", "00112"], "colA1", "colA2", "colA3", "colA4"}] 

"A", "8", "00111", [{1, ["A","C"], ["7", "8"], ["00111", "00112"], "colA1", "colA2", "colA3", "colA4"}] 

"A", "8", "00112", [{1, ["A","C"], ["7", "8"], ["00111", "00112"], "colA1", "colA2", "colA3", "colA4"}] 

"C", "7", "00111", [{1, ["A","C"], ["7", "8"], ["00111", "00112"], "colA1", "colA2", "colA3", "colA4"}] 

"C", "7", "00112", [{1, ["A","C"], ["7", "8"], ["00111", "00112"], "colA1", "colA2", "colA3", "colA4"}] 

"C", "8", "00111", [{1, ["A","C"], ["7", "8"], ["00111", "00112"], "colA1", "colA2", "colA3", "colA4"}] 

"C", "8", "00112", [{1, ["A","C"], ["7", "8"], ["00111", "00112"], "colA1", "colA2", "colA3", "colA4"}] 

"A", "8", "00113", [{2, ["A", "B"], ["8", "9"], ["00112", "00113"], "colB1", "colB2", "colB3", "colB4"}] 

"A", "9", "00112", [{2, ["A", "B"], ["8", "9"], ["00112", "00113"], "colB1", "colB2", "colB3", "colB4"}] 

"A", "9", "00113", [{2, ["A", "B"], ["8", "9"], ["00112", "00113"], "colB1", "colB2", "colB3", "colB4"}] 

。 ..

この場合、「A」、「8」、「00112」は1回だけ取り込まれます。各グループについて、最初に選択するか、Modelオブジェクトのいずれかを選択することは許容されます。これはLambdaJを使って可能ですか?

私は現在、リストから個々の要素を抽出せずに直接リストにグループ化することができます。

Group<Model> grpResult = group(models, by(on(Model.class).getPropertyA()), by(on(Model.class).getPropertyB()), by(on(Model.class).getPropertyC())); 
returns 
[{children=[{children=[{children=[Model [modelId=null, PropertyA=[A, B], PropertyB=[7, 8], PropertyC=[00111, 00112], modelCol1=ACol1, modelCol2=ACol2, modelCol3=null, modelCol4=null]], propertyC=[00111, 00112]}], propertyB=[7, 8]}], propertyA=[A, B]}, 

{children=[{children=[{children=[Model [modelId=null, PropertyA=[A, C], PropertyB=[8, 9], PropertyC=[00112, 00113], modelCol1=BCol1, modelCol2=BCol2, modelCol3=null, modelCol4=null]], propertyC=[00112, 00113]}], propertyB=[8, 9]}], propertyA=[A, C]}] 

アドバイスはありがとうございます。

+0

感謝を作成します私の書式を修正するためのReto!これは私の最初の投稿であり、私はフォーマットされたコードだけですが、将来はデータもフォーマットします。 – user777

答えて

0

最初

class RefModel { 

String PropertyA; 
String PropertyB; 
String PropertyC; 
Model model; 
public RefModel(String propertyA, String propertyB, String propertyC, Model model) {...} 

@Override 
public int hashCode() { 
    // only calculate propertyA, propertyB, propertyC 
    ... 
} 

@Override 
public boolean equals(Object obj) { 
    // only compare propertyA, propertyB, propertyC 
    ... 
} 

@Override 
public String toString() {...} 

} 

その後、まず、それらの明確な選択、1つのリストに追加し、各propertyA、propertyBとpropertyCためRefModelのリストにすべてのモデルを変換し、

Collection<RefModel> refModels = selectDistinct(flatten(convert(models, (Converter<Model, List<RefModel>>)(m)->{ 
      List<RefModel> refs = new ArrayList<RefModel>(); 
      for(String a:m.getPropertyA()){ 
       for(String b:m.getPropertyB()){ 
        for(String c:m.getPropertyC()){ 
         refs.add(new RefModel(a, b, c, m)); 
        } 
       } 
      } 
      return refs; 
     }))); 
+0

ありがとう!できます! – user777

関連する問題