0

オブジェクトのリストがあります。モデルと呼びましょう

public class Model {

String modelId;

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

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

}

サンプルデータ :

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

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

期待される :

モデルのリスト内のリストから要素を取得し、複数のフィールドでグループ化します

"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 回だけキャプチャされます。各グループについて、最初に選択するか、いずれかのモデル オブジェクトを選択することができます。これは 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]}]

どんなアドバイスでも大歓迎です。

4

1 に答える 1

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() {...}

}

次に、最初にすべての Model を各 propertyA、propertyB、および propertyC の RefModel のリストに変換し、次にそれらを 1 つのリストに追加してから、それらの個別のものを選択します。

    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;
        })));
于 2016-05-15T14:29:52.820 に答える