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

我试着得到(I),但是[I] -没有效果。google只返回如何在列表中“找到”元素。但是我已经知道元素的下标了!

下面是无法编译的代码:

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

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


当前回答

使用括号:

data(2)

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

其他回答

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

list_name(index)

为什么括号?

这里引用的是《scala编程》一书中的一段话。

Another important idea illustrated by this example will give you insight into why arrays are accessed with parentheses in Scala. Scala has fewer special cases than Java. Arrays are simply instances of classes like any other class in Scala. When you apply parentheses surrounding one or more values to a variable, Scala will transform the code into an invocation of a method named apply on that variable. So greetStrings(i) gets transformed into greetStrings.apply(i). Thus accessing an element of an array in Scala is simply a method call like any other. This principle is not restricted to arrays: any application of an object to some arguments in parentheses will be transformed to an apply method call. Of course this will compile only if that type of object actually defines an apply method. So it's not a special case; it's a general rule.

下面是一些如何使用函数式编程风格提取特定元素(本例中第一个元素是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)

更安全的方法是使用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))就像一个局部函数,定义在列表中有元素的任何地方。列表中。lift方法通过将结果包装在Option中,将部分apply函数(仅为某些输入定义的函数)转换为普通函数(为任何输入定义的函数)。

使用括号:

data(2)

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