Как получить уникальный список элементов из значений карты - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть Set<Map<String, Object>>. Элементы приведены ниже:

final Set<Map<String, Object>> set = new HashSet<>();
        final Map<String, Object> objectMap1 = new HashMap<>();
        objectMap1.put("name", "Sourav");
        objectMap1.put("class", 10);
        objectMap1.put("city", "London");
        objectMap1.put("Department", "Science");

        final Map<String, Object> objectMap2 = new HashMap<>();
        objectMap2.put("name", "Sourav");
        objectMap2.put("class", 10);
        objectMap2.put("city", "Kolkata");
        objectMap2.put("Department", "Science");

        final Map<String, Object> objectMap3 = new HashMap<>();
        objectMap3.put("name", "Wills");
        objectMap3.put("class", 9);
        objectMap3.put("city", "Peterborough");
        objectMap3.put("Department", "Java");

        final Map<String, Object> objectMap4 = new HashMap<>();
        objectMap4.put("name", "Wills");
        objectMap4.put("class", 9);
        objectMap4.put("city", "Manchester");
        objectMap4.put("Department", "Java");

        set.add(objectMap1);
        set.add(objectMap2);
        set.add(objectMap3);
        set.add(objectMap4);

Согласно приведенному выше примеру студент может проживать в двух городах.

Я хочу получить окончательный список StudentBuilder, где каждый элемент списка будетесть список городов.

Ожидаемый результат: [{"name": Sourav, "city": [London, Kolkata], "Department", "Science", "Standard": 10}, {"name": Wills," city ": [Manchester, Peterborough]," Department "," Java "," Standard ": 9}]

Я сделал это следующим образом, но я использовал два цикла, которыеэто не очень хорошая производительность. Можем ли мы сделать это за один цикл? Ограничения: StudentBuilder не может быть изменен. Это неизменный и сторонний кувшин.

public class TestMain {

    public static void main(String[] args) {
        final Set<Map<String, Object>> set = new HashSet<>();
        final Map<String, Object> objectMap1 = new HashMap<>();
        objectMap1.put("name", "Sourav");
        objectMap1.put("class", 10);
        objectMap1.put("city", "London");
        objectMap1.put("Department", "Science");

        final Map<String, Object> objectMap2 = new HashMap<>();
        objectMap2.put("name", "Sourav");
        objectMap2.put("class", 10);
        objectMap2.put("city", "Kolkata");
        objectMap2.put("Department", "Commerce");

        final Map<String, Object> objectMap3 = new HashMap<>();
        objectMap3.put("name", "Wills");
        objectMap3.put("class", 10);
        objectMap3.put("city", "Peterborough");
        objectMap3.put("Department", "Computer");

        final Map<String, Object> objectMap4 = new HashMap<>();
        objectMap4.put("name", "Wills");
        objectMap4.put("class", 9);
        objectMap4.put("city", "Manchester");
        objectMap4.put("Department", "Java");

        set.add(objectMap1);
        set.add(objectMap2);
        set.add(objectMap3);
        set.add(objectMap4);

        final Map<String, List<String>> locationGroupsByStudent = new HashMap<>();
        set.forEach(a -> {
            locationGroupsByStudent.computeIfAbsent((String)a.get("name"), k -> new ArrayList<>()).add((String)a.get("city"));
        });

        final List<StudentBuilder> studentList = set.stream()
            .filter(d -> locationGroupsByStudent.containsKey(d.get("name")))
            .map(d -> {
                final List<String> locationGroupNames = locationGroupsByStudent.get(d.get("name"));
                locationGroupsByStudent.remove(d.get("name"));
                return StudentBuilder.builder()
                    .name((String)d.get("name"))
                    .cities(locationGroupNames)
                    .department((String)d.get("Department"))
                    .standard((Integer)d.get("class"))
                    .build();
            })
            .collect(Collectors.toList());

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