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

Mar*_*uer 48 scala

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

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

我真正感兴趣的这里是是否有一种方式来获得由返回列表的引用保持split通话,以便其长度可以代入X在时slice通话,有点像一个花哨_(在这种情况下,它会读作slice(3,_.length))?在python中,不需要指定切片的最后一个元素.

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

om-*_*nom 84

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

List(1,2,3,4).drop(2)
res0: List[Int] = List(3, 4)
Run Code Online (Sandbox Code Playgroud)

或者在你的情况下:

string.split("\n").drop(2)
Run Code Online (Sandbox Code Playgroud)

还有配对的方法.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)
Run Code Online (Sandbox Code Playgroud)


小智 81

正确的答案是takeRight(n):

"communism is sharing => resource saver".takeRight(3)
                                              //> res0: String = ver
Run Code Online (Sandbox Code Playgroud)

  • 考虑到OP问题,这不是正确的事情,因为它从最后开始需要n个元素.`List(1,2,3,4).takeRight(3)`产生`List [Int] = List(2,3,4)` (9认同)

hai*_*ang 7

您可以使用scala的list方法'takeRight',当List的长度不够时,这不会抛出异常,如下所示:

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

如果列表不超过您想要的时间,则不会抛出异常:

val t = List(4,5);
t.takeRight(3);
res1: List[Int] = List(4,5)
Run Code Online (Sandbox Code Playgroud)