Конвертировать из List<Person> в Map<String, List<Person>>

190
14 октября 2017, 17:27

Есть сущность Person. У нее есть геттер getId().

Есть список этих сущностей List<Person>.

Как конвертировать из List<Person> в Map<String, List<Person>> так, что бы в качестве ключей были Id?

Т.е. сгрупировать Person по Id.

Answer 1

Самое простое и в лоб:

  • итерировать список
  • проверять за счет containsKey есть ли уже в мапе такой ключ.
  • если нет, то создать список в данном ключе и добавить объект
  • если есть, то в уже созданный список добавить объект

Второй способ - использовать стримы Java8 и их методы, в частности группировки Collectors.groupingBy

Answer 2

Полагаю можно сделать как то так:

Map<String, List<Person>> mapPerson = new HashMap<String, List<Person>>();
for(int i = 0; i<listPerson.size(); i++)
{
    String key = listPerson.get(i).getId();
    if (!mapPerson.containsKey(key))
    {
        mapPerson.put(key, new ArrayList<Person>());
    }
    mapPerson.get(key).add(listPerson.get(i));
}
Answer 3

Вариант на Stream API

Map<String, List<Person>> index = persons.stream()
            .collect(Collectors.groupingBy(Person::getId));

Вариант на коллекциях Java 8 без этих некрасивых containsKey

Map<String, List<Person>> index = new HashMap<>();
for (Person person : persons) {
    index.computeIfAbsent(person.getId(), k -> new ArrayList<>()).add(person);
}
Answer 4

1. Вариант - используем Map<String, Person> (Если ID уникален)

import java.util.ArrayList;
import java.util.HashMap;
public class Main {
    public static void main(String[] args) {
        ArrayList<Person> persons = new ArrayList<>();
        HashMap<String, Person> personsMap = new HashMap<>();
        for (Person person : persons) {
            personsMap.put(person.getId(), person);
        }
    }
    class Person {
        String id;
        public String getId() {
            return id;
        }
    }
}

2. Вариант - используем Map<String, List<Person>> (Если ID повторяются)

import java.util.ArrayList;
import java.util.HashMap;
public class Main1 {
    public static void main(String[] args) {
        ArrayList<Person> persons = new ArrayList<>();
        HashMap<String, ArrayList<Person>> personsMap = new HashMap<>();
        for (Person person : persons) {
            ArrayList<Person> personsList = personsMap.get(person.getId());
            if (personsList == null) {
                personsMap.put(person.getId(), new ArrayList<Person>());
            } else {
                personsList.add(person);
            }
        }
    }
    class Person {
        String id;
        public String getId() {
            return id;
        }
    }
}
Answer 5

если тип сущности Person

Map<String, List<Person>> map = new HashMap<String, List<Person>>();
List<Person> pers = new ArrayList<Person>();
int id = 0;
for(Person x : pers){
    String s = String.valueOf(id);
    map.put(s,x);
    id++;
}
READ ALSO
Использование sharedPreferences

Использование sharedPreferences

есть приложение под android, в нем класс Sharedpref

148
Как создать &ldquo;базу данных&rdquo;? [требует правки]

Как создать “базу данных”? [требует правки]

Новичок, только начал изучать JavaОбъясните, пожалуйста, как создают базы данных в Java

191
Production для front-end и backend сервисов

Production для front-end и backend сервисов

Я разрабатываю приложение, которые имеет два отдельных сервисаОдин из них -> create-react-app, который воспроизводится на порте 3000, другой spring boot rest API service,...

153