在Scala中,如何在不知道长度的情况下从第n个元素到列表末尾获取切片?

时间:2013-03-06 22:20:04

标签: scala

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

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

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

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

4 个答案:

答案 0 :(得分:80)

只需删除不需要的前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)

答案 1 :(得分:80)

正确的答案是takeRight(n)

"communism is sharing => resource saver".takeRight(3)
                                              //> res0: String = ver

答案 2 :(得分:7)

你可以使用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)

答案 3 :(得分:4)

获取最后2个元素:

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