Группировать элементы списка в списке списка в Java - PullRequest
0 голосов
/ 22 октября 2018

У меня есть список элементов.Я хочу сгруппировать элементы этого списка в список, основанный на некоторых условиях.Можно ли сделать это легко в Java?

public class CollectionTest {

    public static void main(String[] arg) {
        Target target0 = new Target();
        target0.setRisklevel("III");
        target0.setLocation("Combined");
        Target target1 = new Target();
        target1.setRisklevel("III");
        target1.setLocation("Combined");
        Target target2 = new Target();
        target2.setRisklevel("III");
        target2.setLocation("Combined");
        Target target3 = new Target();
        target3.setRisklevel("III");
        target3.setLocation("Combined");
        Target target4 = new Target();
        target4.setRisklevel("IV");
        target4.setLocation("Combined");
        Target target5 = new Target();
        target5.setRisklevel("IV");
        target5.setLocation("Combined");
        Target target6 = new Target();
        target6.setRisklevel("IV");
        target6.setLocation("Combined");
        Target target7 = new Target();
        target7.setRisklevel("II");
        target7.setLocation("Domestic");
        Target target8 = new Target();
        target8.setRisklevel("IV");
        target8.setLocation("Domestic");
        Target target9 = new Target();
        target9.setRisklevel("IV");
        target9.setLocation("Domestic");
        Target target10 = new Target();
        target10.setRisklevel("IV");
        target10.setLocation("Domestic");
        Target target11 = new Target();
        target11.setRisklevel("IV");
        target11.setLocation("Domestic");

        List<Target> ucrtargetList = new ArrayList<Target>();
        ucrtargetList.add(target0);
        ucrtargetList.add(target1);
        ucrtargetList.add(target2);
        ucrtargetList.add(target3);
        ucrtargetList.add(target4);
        ucrtargetList.add(target5);
        ucrtargetList.add(target6);
        ucrtargetList.add(target7);
        ucrtargetList.add(target8);
        ucrtargetList.add(target9);
        ucrtargetList.add(target10);
        ucrtargetList.add(target11);
        List<List<Target>> fullList = new ArrayList<List<Target>>();
    }
}

Здесь условие - RiskLevel, и Location должен быть одинаковым в каждом списке в списке List.Таким образом, в fullList должно быть 4 списка (1-й III и комбинированный, 2-й IV и комбинированный, 3-й II и внутренний, 4-й IV и внутренний).

Я мог бы пройтись по списку и установить значения.Есть ли более простой способ сделать это с помощью java8 или apache commons?

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Пока невозможно комментировать, поэтому, добавив ответ, чтобы расширить то, что ответил @Schidu Luca, можно объединить предложения 'groupingBy', как это

Map<String, List<Target>> collect = ucrtargetList.stream()
           .collect(Collectors.groupingBy(Target::getRisklevel, Collectors.groupingBy(Target::getLocation)));
0 голосов
/ 22 октября 2018

Согласно вашему описанию в fullList должно быть 4 списка (1-й III и комбинированный, 2-й IV и комбинированный, 3-й II и внутренний, 4-й IV и внутренний) Я предполагаю, что вы ищете это:

Function<Target, List<String>> riskLevelAndLocation = t -> List.of(t.getRiskLevel(), t.getLocation());
Map<List<String>, List<Target>> fullList = ucrtargetList.stream()
        .collect(Collectors.groupingBy(riskLevelAndLocation));

riskLevelAndLocation - это Function, который повторяет List, содержащий riskLevel и location.groupingBy a List работает, потому что List.equals(Object o)

Возвращает true тогда и только тогда, когда указанный объект также является списком, оба списка имеют одинаковый размер и все соответствующие пары элементовв двух списках равно .

Быстрая проверка:

for (Entry<List<String>, List<Target>> entrySet : fullList.entrySet()) {
    System.out.println(entrySet.getKey().toString() + ": " + entrySet.getValue().size());
}

Вывод:

[IV, Combined]: 3
[II, Domestic]: 1
[III, Combined]: 4
[IV, Domestic]: 4

Если fullList должен иметь порядок, который вы описали, тогда вы можете использовать LinkedHashMap и отсортировать его.

0 голосов
/ 22 октября 2018
List<List<Target>> fullList = ucrtargetList.stream()
                .collect(Collectors.groupingBy(Target::getRisklevel)) // Or another collector
                .entrySet()
                .stream()
                .map(Map.Entry::getValue)
                .collect(Collectors.toList());

Если вы хотите удалить те же объекты из результата, вам нужно добавить методы 'equals' и 'hashcode' и собирать в Set.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...