如何获得Seq的第n个元素?

时间:2016-04-14 05:01:55

标签: scala

我想获得Seq的第n个元素,如下所示:

val mySeq = Seq("A", "B", "C")
mySeq.get(1) // Java syntax for List. This does not work.

4 个答案:

答案 0 :(得分:18)

为避免索引越界,

scala> mySeq(200)
java.lang.IndexOutOfBoundsException: 200
  at scala.collection.LinearSeqOptimized$class.apply(LinearSeqOptimized.scala:65)
  at scala.collection.immutable.List.apply(List.scala:84)
  ... 33 elided

解除序列,

mySeq.lift(2)
Some(C)

mySeq.lift(200)
None

或以类似的方式,

mySeq.drop(2).headOption
Some(C)

mySeq.drop(200).headOption
None

通过提升序列,我们将Int的部分函数定义到序列的每个值上。即从每个位置索引到其对应的值。因此,未定义的位置(任何负值或大于集合的大小)都会映射到None,其余的已定义并变为Some值。

答案 1 :(得分:16)

mySeq.apply(1)是另一种说mySeq(1)

的方式
scala> val mySeq = Seq("A", "B", "C")
mySeq: Seq[String] = List(A, B, C)

scala> mySeq(0)
res0: String = A

scala> mySeq(1)
res1: String = B

答案 2 :(得分:2)

获取Seq n 元素的方法是apply

val mySeq = Seq("A", "B", "C")
mySeq.apply(1) // "B"

通常你永远不会写x.apply(y)而只是使用简写x(y)。 Scala编译器会为你转换它。

mySeq(1) // "B"

答案 3 :(得分:0)

在Tom的回答中,还有一个特定的用例,其中需要.apply(),如果您有一个只投给seq的对象。在这种情况下,您不能使用(),因为您的对象未命名。这是一个示例:

println("Count of column test in MyDF is "+MyDF.groupBy().agg(count("test")).first.toSeq.apply(0));

或者,坚持上面的例子:

println("Second element of Seq(\"A\", \"B\", \"C\") is: "+Seq("A", "B", "C").apply(1));

Second element of Seq("A", "B", "C") is: B