在Scala中获取列表中的项目?

在这个世界上,你如何得到一个元素在索引从列表在scala?

我尝试了get(i),和[i] -没有工作。谷歌搜索只返回如何“查找”;列表中的元素。但是我已经知道元素的下标了!

下面是无法编译的代码:

def buildTree(data: List[Data2D]):Node ={
if(data.length == 1){
var point:Data2D = data[0]  //Nope - does not work
       

}
return null
}

看着列表api没有帮助,因为我的眼睛只是交叉。

317611 次浏览

使用括号:

data(2)

但是您不希望经常对列表执行此操作,因为链表需要花费时间来遍历。如果你想索引到一个集合,使用Vector(不可变)或ArrayBuffer(可变)或可能的Array(这只是一个Java数组,除了你再次索引到它使用(i)而不是[i])。

更安全的方法是使用lift,这样如果值存在就可以提取出来,如果不存在就会优雅地失败。

data.lift(2)

如果列表不够长,则返回None,如果足够长,则返回Some(value)。

scala> val l = List("a", "b", "c")
scala> l.lift(1)
Some("b")
scala> l.lift(5)
None

无论何时执行可能以这种方式失败的操作,最好使用Option并获得类型系统,以帮助确保您正在处理元素不存在的情况。

解释:

这是因为List的apply(它只是括号,例如l(index))就像一个局部函数,定义在列表中有元素的任何地方。List.lift方法通过将结果包装在Option中,将部分apply函数(仅为某些输入定义的函数)转换为正常函数(为任何输入定义的函数)。

为什么括号?

下面是引用自用scala编程这本书。

这个例子所说明的另一个重要思想将使您深入了解为什么在Scala中使用括号访问数组。Scala的特殊情况比Java少。数组只是类的实例,就像Scala中的其他类一样。当您对一个变量应用圆括号包围一个或多个值时,Scala会将代码转换为对该变量的名为apply的方法的调用。因此greetStrings(i)被转换成greetStrings。apply(i)因此,在Scala中访问数组的元素只是一个简单的方法调用。这个原则并不局限于数组:对象对括号中的参数的任何应用都将转换为apply方法调用。当然,只有当该类型的对象实际定义了apply方法时,才会编译。所以这不是特例;这是一个普遍的规则。

下面是一些如何使用函数式编程风格提取特定元素(本例中第一个元素是elem)的示例。

  // Create a multdimension Array
scala> val a = Array.ofDim[String](2, 3)
a: Array[Array[String]] = Array(Array(null, null, null), Array(null, null, null))
scala> a(0) = Array("1","2","3")
scala> a(1) = Array("4", "5", "6")
scala> a
Array[Array[String]] = Array(Array(1, 2, 3), Array(4, 5, 6))

  // 1. paratheses
scala> a.map(_(0))
Array[String] = Array(1, 4)
// 2. apply
scala> a.map(_.apply(0))
Array[String] = Array(1, 4)
// 3. function literal
scala> a.map(a => a(0))
Array[String] = Array(1, 4)
// 4. lift
scala> a.map(_.lift(0))
Array[Option[String]] = Array(Some(1), Some(4))
// 5. head or last
scala> a.map(_.head)
Array[String] = Array(1, 4)

请使用括号()来访问元素列表,如下所示。

list_name(index)