Если вы можете терпеть вызов, чтобы получить длину списка, то
l.grouped( (l.length+2)/3 ).toList
будет производить что-то похожее на то, что вы хотите (если val l = List(34, 11, 23, 1, 9, 83, 5)
, тогда вы получите List(List(34, 11, 23), List(1, 9, 83), List(5))
обратно. Но если вы хотите примерно равное распределение по спискам, вам придется создать собственный метод, чтобы сделать это - нет библиотечной функции, которая делит список поровну на n
частей.
Что-то вроде этого сработало бы, если вы хотите сохранить части в порядке:
def chopList[T](
l: List[T], pieces: Int,
len: Int = -1, done: Int = 0, waiting: List[List[T]]=Nil
): List[List[T]] = {
if (l isEmpty) waiting.reverse
else {
val n = (if (len<0) l.length else len)
val ls = l.splitAt( (n.toLong*(done+1)/pieces - n.toLong*done/pieces).toInt )
chopList(ls._2,pieces,n,done+1,ls._1 :: waiting)
}
}
и это происходит, чтобы вернуть именно то, что вы хотите: List(List(34, 11), List(23, 1), List(9, 83, 5))
.
Если вы не хотите запрашивать длину списка, вы можете написать метод, который создает группу блоков и добавляет по очереди каждый новый элемент.