2016-05-15 3 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; 

} 

Образца данные:

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» захватывается только один раз. Для каждой группы выбор первого или выбора любого из объектов модели допустим. Возможно ли это с помощью 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() {...} 

} 

затем сначала преобразовать каждую модель в список RefModel для каждого propertyA, propertyB и propertyC, затем добавить их в один список, а затем выберите отличие от них,

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

Спасибо andy! Оно работает! – user777

Смежные вопросы