2011-02-13 38 views
138

在世界上你是如何从scala列表中获得索引i的元素的?将项目列入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 
} 

望着List api没有帮助,因为我的眼睛刚刚越过。

+0

好吧好吧,好像** ** data.head工作......但还是只给我第一个元素,不是任何一个在列表中。 – drozzy 2011-02-13 00:53:59

+0

如果您确定索引不超出范围,请使用** Seq **特征** apply(index)**。 _http://www.scala-lang.org/api/current/?_ga = 1.201071334.935145902.1460491527#scala.collection.Seq_ – Beezer 2016-06-23 19:10:40

+0

data.drop(i).head用于访问第i个元素 – Vinay 2017-04-16 03:54:36

回答

206

使用括号:

data(2) 

但你真的不希望这样做与列表很多时候,因为链表需要时间来穿越。如果要索引到集合中,请使用Vector(不可变)或ArrayBuffer(可变)或可能Array(它只是一个Java数组,除了再次使用(i)而不是[i]索引它)。

69

更安全的是使用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 

每当你执行的是可以通过这种方式我们很高兴地使用一个选项,让类型系统,以帮助确保您正在处理其中的元素不存在的情况下失败的操作。

说明:

此操作,因为列表的apply(其糖只是括号,例如l(index))就是这样被定义无论该列表具有元件的部分功能。 List.lift方法通过将结果基本包装到一个选项中,将部分apply函数(仅针对某些输入定义的函数)转换为正常函数(针对任何输入定义)。

8

为什么括号?

以下是书programming in scala的引用。

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

下面是一些使用函数式编程风格来拉动某个元素(在这种情况下是第一个元素)的例子。

// 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) 
相关问题