首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将scala列表拆分为n个交错列表

将scala列表拆分为n个交错列表
EN

Stack Overflow用户
提问于 2012-06-21 14:36:51
回答 3查看 2.1K关注 0票数 5

给定一个List,比如

代码语言:javascript
复制
List(1, 2, 3, 4, 5, 6, 7)

将其分成n个子列表的最佳方式是什么,以循环方式将项目放入每个列表中?

例如,如果n= 3,则结果应为

代码语言:javascript
复制
List(List(1, 4, 7), List(2, 5), List(3, 6))

我以为在集合API中会有一个方法来做这件事,但是我似乎找不到它。

优秀的一行程序的加分;)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-21 14:56:56

代码语言:javascript
复制
scala> def round[T](l: List[T], n: Int) = (0 until n).map{ i => l.drop(i).sliding(1, n).flatten.toList }.toList
round: [T](l: List[T], n: Int)List[List[T]]

scala> round((1 to 7).toList, 3)
res4: List[List[Int]] = List(List(1, 4, 7), List(2, 5), List(3, 6))
票数 10
EN

Stack Overflow用户

发布于 2012-06-21 15:13:50

下面是一个简单的一行代码:

代码语言:javascript
复制
scala> List.range(1, 10)
res11: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)

scala> res11.grouped(3).toList.transpose
res12: List[List[Int]] = List(List(1, 4, 7), List(2, 5, 8), List(3, 6, 9))

不幸的是,当您的列表不可转置时,它将无法工作。

代码语言:javascript
复制
scala> List.range(1, 8).grouped(3).toList.transpose
java.lang.IllegalArgumentException: transpose requires all collections have the 
same size

您可以使用以下方法使其可转置,然后应用上面的方法。

代码语言:javascript
复制
scala> def extend[A](xs: List[A], c: Int): List[Option[A]] = {
     |   val n = Stream.iterate(c)(c +).find(_ >= xs.length).get
     |   xs.map(Some(_)).padTo(n, None)
     | }
extend: [A](xs: List[A], c: Int)List[Option[A]]

scala> List.range(1, 8)
res13: List[Int] = List(1, 2, 3, 4, 5, 6, 7)

scala> extend(res13, 3).grouped(3).toList.transpose.map(_.flatten)
res14: List[List[Int]] = List(List(1, 4, 7), List(2, 5), List(3, 6))

放在一起:

代码语言:javascript
复制
scala> def round[A](xs: List[A], c: Int) = {
     |   val n = Stream.iterate(c)(c +).find(_ >= xs.length).get
     |   val ys = xs.map(Some(_)).padTo(n, None)
     |   ys.grouped(c).toList.transpose.map(_.flatten)
     | }
round: [A](xs: List[A], c: Int)List[List[A]]

scala> round(List.range(1, 10), 3)
res16: List[List[Int]] = List(List(1, 4, 7), List(2, 5, 8), List(3, 6, 9))

scala> round(List.range(1, 8), 3)
res17: List[List[Int]] = List(List(1, 4, 7), List(2, 5), List(3, 6))
票数 4
EN

Stack Overflow用户

发布于 2015-06-26 15:07:35

如果你不关心轮询,你可以这样做:

代码语言:javascript
复制
val list = List(1, 2, 3, 4, 5, 6, 7)
list.grouped(Math.ceil(list.size / 3))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11132788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档