我想出这个实施groupBy
:在Scala中实现groupBy方法的替代方法?
object Whatever
{
def groupBy[T](in:Seq[T],p:T=>Boolean) : Map[Boolean,List[T]] = {
var result = Map[Boolean,List[T]]()
in.foreach(i => {
val res = p(i)
var existing = List[T]() // how else could I declare the reference here? If I write var existing = null I get a compile-time error.
if(result.contains(res))
existing = result(res)
else {
existing = List[T]()
}
existing ::= i
result += res -> existing
})
return result
}
}
,但它似乎并不十分Scalish(是这个词我在找?)给我。你可能会建议一些改进?
编辑:我收到的“暗示”关于折叠后,我实现了这种方式:
def groupFold[T](in:Seq[T],p:T=>Boolean):Map[Boolean,List[T]] = {
in.foldLeft(Map[Boolean,List[T]]()) ((m,e) => {
val res = p(e)
m(res) = e :: m.getOrElse(res,Nil)
})
}
你觉得呢?
折叠实现是非常有用的。请注意,您可以用普通类型U替换布尔值,折叠仍然可以工作! – 2010-01-26 20:59:43