在Scala列表中获取项目?

时间:2011-02-13 00:47:03

标签: scala

你是如何从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
}

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

5 个答案:

答案 0 :(得分:265)

使用括号:

data(2)

但是你并不是真的想经常使用列表,因为链表需要时间来遍历。如果要索引到集合,请使用Vector(不可变)或ArrayBuffer(可变)或可能Array(这只是一个Java数组,除了再次使用{进行索引) {1}}代替(i))。

答案 1 :(得分:102)

更安全是使用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并获取类型系统以帮助确保您正在处理元素不具备的情况是很好的存在。

<强>解释

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

答案 2 :(得分:9)

为什么要括号?

以下是本书programming in 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))
  // 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)

答案 3 :(得分:2)

请使用括号()访问列表元素 list_name(index)

答案 4 :(得分:0)

这是当今通过索引访问列表数据的首选方式:

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

但是就像上面提到的Rex Kerr一样: 如果使用索引,则应考虑使用Vector而不是List。