Je suis venu avec cette mise en œuvre de groupBy
:Autre façon d'implémenter une méthode groupBy dans Scala?
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
}
}
mais il ne semble pas très Scalish (est-ce le mot que je cherche?) Pour moi. Pourriez-vous suggérer des améliorations?
EDIT: après avoir reçu le « conseil » au sujet de pliage, je l'ai mis en œuvre ainsi:
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)
})
}
Que pensez-vous?
La mise en œuvre pli est particulièrement utile lorsque vous avez plus de valeurs que Boolean a. Notez que vous pourriez remplacer Boolean par un type générique U et le fold fonctionnerait toujours! –