57

我正在寻找一种优雅的方法来从元素 n 开始获取列表的一部分,而无需指定列表的长度。假设我们有一个多行字符串,我将其拆分为多行,然后想要获取从第 3 行开始的所有行的列表:

string.split("\n").slice(3,X)       // But I don't know what X is...

我在这里真正感兴趣的是是否有办法获取调用返回的列表的引用,以便在调用split时可以替换它的长度,有点像幻想(在这种情况下它会读作)?在 python 中,不需要指定切片的最后一个元素。Xslice_slice(3,_.length)

当然我可以通过在拆分后使用临时变量来解决这个问题,或者创建一个语法很好的辅助函数,但我只是好奇。

4

4 回答 4

96

只需删除您不需要的前 n 个元素:

List(1,2,3,4).drop(2)
res0: List[Int] = List(3, 4)

或者在你的情况下:

string.split("\n").drop(2)

还有一种.take(n)做相反事情的配对方法,你可以把它想象成.slice(0,n).

如果您需要这两个部分,请使用.splitAt

val (left, right) = List(1,2,3,4).splitAt(2)
left: List[Int] = List(1, 2)
right: List[Int] = List(3, 4)
于 2013-03-06T22:21:10.050 回答
90

正确答案是takeRight(n)

"communism is sharing => resource saver".takeRight(3)
                                              //> res0: String = ver
于 2015-03-16T20:05:37.730 回答
10

你可以使用scala的list方法'takeRight',当List的长度不够时,不会抛出异常,像这样:

val t = List(1,2,3,4,5);
t.takeRight(3);
res1: List[Int] = List(3,4,5)

如果列表不长于您想要的长度,则不会抛出异常:

val t = List(4,5);
t.takeRight(3);
res1: List[Int] = List(4,5)
于 2016-09-27T08:32:00.363 回答
4

获取最后两个元素:

List(1,2,3,4,5).reverseIterator.take(2)

于 2013-09-11T04:50:52.420 回答