Task Livecoding Partition List

11. Разделение списка на партиции #

Спойлеры к решению
Подсказки
🔹 Нам нужно разделить список на подсписки фиксированного размера.
🔹 Если длина списка не делится нацело, последний подсписок будет короче.
🔹 Можно использовать подход с циклами или Stream API.
Решение

1️⃣ Способ: Обычный цикл
Простой и понятный способ с использованием subList():

import java.util.ArrayList;
import java.util.List;

class PartitionList {
    public static <T> List<List<T>> partition(List<T> list, int size) {
        List<List<T>> partitions = new ArrayList<>();
        for (int i = 0; i < list.size(); i += size) {
            partitions.add(list.subList(i, Math.min(i + size, list.size())));
        }
        return partitions;
    }

    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            numbers.add(i);
        }

        List<List<Integer>> result = partition(numbers, 3);
        System.out.println(result);
    }
}

Вывод: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]

2️⃣ Способ: Stream API (Java 8+)
Используем IntStream для разделения списка:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

class PartitionListStream {
    public static <T> List<List<T>> partition(List<T> list, int size) {
        return IntStream.range(0, (int) Math.ceil((double) list.size() / size))
                .mapToObj(i -> list.subList(i * size, Math.min((i + 1) * size, list.size())))
                .collect(Collectors.toList());
    }

    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            numbers.add(i);
        }

        List<List<Integer>> result = partition(numbers, 3);
        System.out.println(result);
    }
}

Вывод: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]

💡 Вывод: Обычный цикл проще, но Stream API более декларативный 🚀