Как разбить список элементов на списки, содержащие не более N элементов?
Пример: учитывая список из 7 элементов, создайте группы из 4, оставив последнюю группу, возможно, с меньшим количеством элементов.
split(List(1,2,3,4,5,6,"seven"),4)
=> List(List(1,2,3,4), List(5,6,"seven"))
Есть гораздо более простой способ выполнить задачу, используя метод скольжения. Это работает так:
Допустим, вы хотите разбить список на более мелкие списки размером 3.
дам тебе
источник
Или, если вы хотите сделать свой собственный:
Использование:
edit : просмотрев это 2 года спустя, я бы не рекомендовал эту реализацию, поскольку
size
это O (n), и, следовательно, этот метод - O (n ^ 2), что объясняет, почему встроенный метод становится быстрее для больших списков, как указано в комментариях ниже. Вы можете эффективно реализовать следующее:или даже (немного) более эффективно, используя
splitAt
:источник
xs splitAt n
является альтернативой комбинацииxs take n
иxs drop n
splitAt
вместоtake
/drop
повышает производительность в среднем на 4%; оба на 700-1000% быстрее.grouped(n).toList
!grouped-toList
так медленно? Звучит как ошибка.grouped
не существует :)) простота является решающим фактором. Для стандартной библиотеки стабильность и производительность должны быть важнее элегантности. Но есть множество примеров как в Программе на Scala, так и в стандартных библиотеках нормально-рекурсивных (а не хвостово-рекурсивных) вызовов; это стандартное и важное оружие в наборе инструментов FP.Я добавляю хвостовую рекурсивную версию метода разделения, поскольку было некоторое обсуждение хвостовой рекурсии по сравнению с рекурсией. Я использовал аннотацию tailrec, чтобы заставить компилятор жаловаться на случай, если реализация действительно не учитывает хвост. Я считаю, что хвостовая рекурсия превращается в цикл под капотом и поэтому не вызовет проблем даже для большого списка, поскольку стек не будет расти бесконечно.
источник
Я думаю, что это реализация с использованием splitAt вместо take / drop
источник