首页 文章

在Scala列表中获取项目?

提问于
浏览
164

你是如何从scala中的List中获得索引 i 的元素的?

我试过 get(i)[i] - 什么都行不通 . 谷歌搜索只返回如何"find"列表中的元素 . 但我已经知道元素的索引了!

这是不编译的代码:

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

  }
  return null
}

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

4 回答

  • 89

    使用括号:

    data(2)
    

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

  • 8

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

    Explanation:

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

  • 247

    为什么括号?

    以下是书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)
    
  • 1

    请使用括号()来访问列表元素list_name(索引)

相关问题