2013-05-14 38 views
2

好的人,请原谅我,如果这个问题已经被问到。又一个Scala新手问题。所以例如,如果我想要一个全局List对象,可以用作占位符容器,在Java中我可以轻松完成;将元素添加到scala中的全局列表对象

//share list object 
private List<String> strList = new ArrayList<>(); 
void add(String el) 
{ 
strList.add(e); 
} 

static void main(String[] args) { 
{ 
    add("36 Chambers"); 
    out.println(strList.get(0));//assume only element 
} 

同样,如果我模拟Scala的相同的语法 - 我最终java.lang.IndexOutOfBoundsException: 0。如何才能实现类似简单的斯卡拉?

private var strList: List[String] = Nil 
    def add(el: String) { 
    strList :+ el 
    } 

    def main(args: Array[String]) { 
    add("36 Chambers") 
    println(s(0)) //assume only element 
    } 
+0

不会打扰书面答复,因为你已经接受了一个,但'List'似乎是完全错误的收集你的目的 - 你应该使用'VECTOR',同时具有快速和追加prepend,并且是用于快速查找的索引集合的标准实现。你可以写'strVector = strVector:+ el',或者短版本'strVector:+ = el'。 –

+0

@LuigiPlinge请添加一个答案 - 这有助于他人轻松挖掘并找到与您一样的相关答案。我会给你一个投票。 – Bitmap

回答

1

要严格回答你的问题:

private var strList: List[String] = Nil 
def add(el: String) { 
     strList = el :: strList; 
} 

您使用了错误的操作。您需要使用::。而且你需要更新内联,因为List是不可改变的长度。

我切换elstrList因为::是右结合,这意味着该方法来源于所述对象到所述操作者::的右侧。

此外,::运算符将执行前置,这意味着您的元素将以相反的顺序。

您可以在最后(使用前等)调用reverse,或者如果您想要某种与Java ArrayList语义相似的东西,可能考虑Scala ListBuffer,您可以将它添加到可变集合中。

import scala.collection.mutable.ListBuffer; 
private var strList: ListBuffer[String] = Nil 
def add(el: String) { 
     strList += el; 
}