你是如何从scala中的List中获得索引i中的元素的?
我想get(i)
,和 [i]
-没有什么作品.谷歌搜索只返回如何"查找"列表中的元素.但我已经知道元素的索引了!
这是不编译的代码:
def buildTree(data: List[Data2D]):Node ={
if(data.length == 1){
var point:Data2D = data[0] //Nope - does not work
}
return null
}
Run Code Online (Sandbox Code Playgroud)
看着列表api并没有帮助,因为我的眼睛只是交叉.
Rex*_*err 279
使用括号:
data(2)
Run Code Online (Sandbox Code Playgroud)
但是你并不是真的想经常使用列表,因为链表需要时间来遍历.如果要索引到集合,请使用Vector
(不可变)或ArrayBuffer
(可变)或可能Array
(这只是一个Java数组,除了再次使用(i)
而不是索引它[i]
).
ada*_*ish 112
使用更安全,lift
因此您可以提取值(如果存在),如果不存在则优先失败.
data.lift(2)
Run Code Online (Sandbox Code Playgroud)
如果列表不足以提供该元素,则返回None;如果列表不足,则返回Some(value).
scala> val l = List("a", "b", "c")
scala> l.lift(1)
Some("b")
scala> l.lift(5)
None
Run Code Online (Sandbox Code Playgroud)
每当您执行可能以这种方式失败的操作时,最好使用Option并获取类型系统以帮助确保您正在处理元素不存在的情况.
说明:
这是有效的,因为List apply
(仅仅是括号中的糖l(index)
)就像是在列表中有元素的任何地方定义的部分函数.该List.lift
方法apply
通过将结果基本包装在Option中,将partial 函数(仅为某些输入定义的函数)转换为普通函数(为任何输入定义).
为什么括号?
以下是scala编程中的引用.
此示例说明的另一个重要思想将让您深入了解为什么在Scala中使用括号访问数组的原因.Scala的特殊情况比Java少.数组就像Scala中任何其他类一样,只是类的实例.当您将一个或多个值的括号应用于变量时,Scala会将代码转换为对该变量名为apply的方法的调用.所以greetStrings(i)被转换成greetStrings.apply(i).因此,在Scala中访问数组的元素只是一个方法调用,就像任何其他方法一样.此原则不限于数组:对象在括号中的某些参数的任何应用都将转换为apply方法调用.当然,只有当该类型的对象实际定义了apply方法时,才会编译.所以这不是一个特例; 这是一般规则.
下面是一些如何使用函数式编程样式拉出某个元素(在本例中为first 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))
Run Code Online (Sandbox Code Playgroud)
// 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)
Run Code Online (Sandbox Code Playgroud)