scala循环链接列表

时间:2010-11-04 03:12:15

标签: scala

在scala中,循环链接列表(scala.collection.mutable.LinkedList)的好方法是什么?例如,我想让'for'循环遍历链表上的每个对象并进行处理。

2 个答案:

答案 0 :(得分:11)

用foreach:

Welcome to Scala version 2.8.0.final (Java HotSpot(TM) Client VM, Java 1.6.0_21).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val ll = scala.collection.mutable.LinkedList[Int](1,2,3)
ll: scala.collection.mutable.LinkedList[Int] = LinkedList(1, 2, 3)

scala> ll.foreach(i => println(i * 2))
2
4
6

或者,如果您对每个对象的处理返回一个新值,请使用map:

scala> ll.map(_ * 2)                  
res3: scala.collection.mutable.LinkedList[Int] = LinkedList(2, 4, 6)

有些人更喜欢使用进行理解而不是foreachmap。它们看起来像这样:

scala> for (i <- ll) println(i)
1
2
3

scala> for (i <- ll) yield i * 2
res5: scala.collection.mutable.LinkedList[Int] = LinkedList(2, 4, 6)

答案 1 :(得分:9)

扩展上一个答案...... for,foreach和map都是高阶函数 - 它们都可以作为参数使用函数,所以从这里开始:

val list = List(1,2,3)
list.foreach(i => println(i * 2))

您可以通过多种方式使代码在本质上更具说明性,同时更清晰。

首先,您实际上不需要使用名称 - i - 对于集合的每个成员,您可以使用_作为占位符:

list.foreach(println(_ * 2))

您还可以将逻辑分离为不同的方法,并继续使用占位符语法:

def printTimesTwo(i:Int) = println(i * 2)
list.foreach(printTimesTwo(_))

更干净,只需传递原始功能而不指定参数(看看ma,没有占位符!

list.foreach(printTimesTwo)

为了得出合乎逻辑的结论,使用 infix 语法可以使其更加清晰。我在这里展示了使用标准库方法。 注意:如果需要,您甚至可以使用从java库导入的方法

list foreach println

这种思维扩展到匿名函数和部分应用函数以及地图操作:

// "2 *" creates an anonymous function that will double its one-and-only argument
list map { 2 * }

在这个级别工作时,For-comprehension并不是非常有用,他们只是添加了样板。但是在使用更深层次的嵌套结构时,它们确实会自成一体:

//a list of lists, print out all the numbers
val grid = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
grid foreach { _ foreach println } //hmm, could get confusing
for(line <- grid; cell <- line) println(cell) //that's clearer

我不需要yield关键字,因为没有返回任何内容。但是如果我想找回一个字符串列表(非嵌套):

for(line <- grid; cell <- line) yield { cell.toString }

有很多生成器,你需要将它们分成多行:

for {
  listOfGrids <- someMasterCollection
  grid <- listOfGrids
  line <- grid
  cell <- line
} yield {
  cell.toString
}