fondamentalement je ne suis pas vraiment un fan de Java/Scala, mais malheureusement, je suis obligé de l'utiliser pour mes études. De toute façon, on m'a assigné une tâche:scala liste d'objets, en utilisant groupBy avec la moyenne
Ce que le programme obtient est une liste d'objets comme: Mark(val name String, val style_mark Int, val other_mark Int)
.
Comment utiliser groupBy, pour grouper les marques par nom, et obtenir une moyenne pour style_mark et other_mark?
Mark("John", 2, 5)
Mark("Peter", 3, 7)
Mark("John", 4, 3)
doit retourner:
Mark("John", 3, 4)
Mark("Peter", 3, 7)
Cest le code:
class Mark(val name: String, val style_mark: Int, val other_mark: Int) {}
object Test extends Application
{
val m1 = new Mark("Smith", 18, 16);
val m2 = new Mark("Cole", 14, 7);
val m3 = new Mark("James", 13, 15);
val m4 = new Mark("Jones", 14, 16);
val m5 = new Mark("Richardson", 20, 19);
val m6 = new Mark("James", 4, 18);
val marks = List(m1, m2, m3, m4, m5, m6);
def avg(xs: List[Int]) = xs.sum/xs.length
marks.groupBy(_.name).map { kv => Mark(kv._1, avg(kv._2.map(_.style_mark)), avg(kv._2.map(_.other_mark))) }
println(marks);
}
Toute aide serait grandement appréciée,
Paul
Merci pour la réponse, je l'ai en quelque sorte compris. Mis à jour ma question avec le code que je connais bien, mais il me donne une erreur 'error: non trouvé: value Mark' at' Mark (kv._1, ... ' – PawelMysior
@Pawel: Si' Mark' n'est pas un classe de cas, vous devez écrire 'new Mark (bla, bla, bla)' au lieu de 'Mark (bla, bla, bla)'. – sepp2k
@Pawel: Notez également que la valeur de 'marques' restera inchangée, de sorte que vous devrait imprimer la valeur de retour de l'expression, pas la valeur de 'marks'. (Bien qu'il soit plus facile de tester le code dans REPL qu'en créant un fichier et en l'exécutant, vous pouvez simplement entrer l'expression et voir son résultat – sepp2k