Das ist ziemlich pragmatisch. Musterübereinstimmung über der Liste der Personen, überprüfen Sie die Bedingungen in jedem rekursiven Aufruf und fügen Sie den Ergebnissen nach Bedarf hinzu, bis die Liste erschöpft ist. Die Ergebnisse sind eine List
Person
, die in eine Tuple
gestopft wird.
class Person(val name: String, val age: Integer, val gender: Character){
override def toString = name + " " + age + " " + gender
}
val alice = new Person("Alice", 18, 'f')
val bob = new Person("Bob", 18, 'm')
val charlie = new Person("Charlie", 60, 'm')
val diane = new Person("Diane", 65, 'f')
val fred = new Person("Fred", 65, 'm')
def filterPersons(persons: List[Person]) = {
import scala.collection.mutable.{ListBuffer => LB}
def filterPersonsR(persons: List[Person], males: LB[Person], anames: LB[Person], seniors: LB[Person]): Tuple3[LB[Person], LB[Person], LB[Person]] = persons match {
case Nil => (males, anames, seniors)
case h :: t => {
filterPersonsR(t, if(h.gender == 'm') males += h else males, if(h.name.startsWith("A")) anames += h else anames, if(h.age >= 60) seniors += h else seniors)
}
}
filterPersonsR(persons, LB(), LB(), LB())
}
Testing ...
scala> filterPersons(List(alice, bob, charlie, diane, fred))
res25: (scala.collection.mutable.ListBuffer[Person], scala.collection.mutable.ListBuffer[Person], scala.collection.mutable.ListBuffer[Person]) = (ListBuffer(Bob 18 m, Charlie 60 m, Fred 65 m),ListBuffer(Alice 18 f),ListBuffer(Charlie 60 m, Diane 65 f, Fred 65 m))
scala> res25._1
res26: scala.collection.mutable.ListBuffer[Person] = ListBuffer(Bob 18 m, Charlie 60 m, Fred 65 m)
scala> res25._2
res27: scala.collection.mutable.ListBuffer[Person] = ListBuffer(Alice 18 f)
scala> res25._3
res28: scala.collection.mutable.ListBuffer[Person] = ListBuffer(Charlie 60 m, Diane 65 f, Fred 65 m)
+1, aber wow, das sieht komplex aus. Ist diese Art von Sachen im Scala-Land ziemlich alltäglich? – sasuke
Ein pragmatischerer Ansatz besteht darin, in der Methode veränderbare Auflistungen wie mutable.ListBuffer zu verwenden, dann result() aufzurufen und die unveränderbaren Auflistungen zurückzugeben. Das ist nicht rein funktional, sondern lesbarer und intuitiver. –
Yup, ich akzeptiere diese Antwort, weil dies das ist, wonach ich gefragt habe, aber ich werde mit dem veränderbaren Ansatz gehen. Dies ist so, weil es scheint, dass es keine Probleme geben sollte, solange die Mutation in einer Methode enthalten ist. – sasuke