Разделение элементов на различное количество списков в Java?

1

У меня проблема с разделением элементов на разные списки на Java. Проблема в том, что мне нужно неопределенное количество новых списков. Например, у меня есть метод, который возвращает список, содержащий некоторое количество объектов, но если у меня есть 50 элементов в этом списке, я хочу разбить их на небольшие списки. Для 50 элементов мне понадобится 10 новых списков, чтобы поместить эти элементы внутрь, но если это число увеличится до 100, мне понадобятся 20 новых списков. Есть ли способ сказать, что Java автоматически генерирует новый список для меня, если это необходимо?

  • 1
    Создать List<List>
  • 0
    Помимо кодирования это самостоятельно? Что вы сделали до сих пор, чтобы разделить списки?
Показать ещё 4 комментария
Теги:
list
arraylist
collections

1 ответ

1
Лучший ответ

Похоже, вы хотите, что часто называют "группировкой". Чтобы воспользоваться упрощенным примером (из комментариев), у вас есть куча объектов Customer и вы хотите сгруппировать их в отдельные списки, классифицированные по City. (Ваша настоящая проблема может быть более сложной, чем эта, но пусть работает с примером City на данный момент.)

Чтобы иметь произвольное количество списков, удобным способом их организации является создание Map<City, List<Customer>>. То есть у вас есть карта, чей ключ является City и чье значение представляет собой List объектов Customer которые находятся в этом City.

Достаточно просто написать обычный цикл, который проходит через входной List<Customer> и сохраняет их в Map как я описал выше. Небольшая морщина заключается в том, что вам приходится обрабатывать создание List и помещать его в Map при первом обращении к Customer из City который вы не видели раньше. Здесь код:

List<Customer> inputList = ...;
Map<City, List<Customer>> map = new HashMap<>();
for (Customer cust : inputList) {
    City city = cust.getCity();
    List<Customer> custList = map.get(city);
    if (custList == null) {
        custList = new ArrayList<>();
        map.put(city, custList);
    }
    custList.add(cust);
}

В Java 8 вы можете использовать новый метод Map.computeIfAbsent() чтобы сохранить немного проблем с обработкой специального случая создания списка для первого клиента из города:

Map<City, List<Customer>> map = new HashMap<>();
for (Customer cust : inputList) {
    City city = cust.getCity();
    map.computeIfAbsent(city, k -> new ArrayList<>());
    map.get(city).add(cust);
}

Но если вы используете Java 8, вы можете также использовать Streams API, который имеет класс Collectors который может очень удобно выполнять такую группировку:

Map<City, List<Customer>> map =
    inputList.stream()
        .collect(Collectors.groupingBy(Customer::getCity));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню