From aa4de7d7a68bd853829075275791262bd623df36 Mon Sep 17 00:00:00 2001 From: "joel.vonderwe" <joel.von-der-weid@etu.hesge.ch> Date: Thu, 5 Mar 2020 15:27:36 +0100 Subject: [PATCH] Collections exos --- base_tp/src/collection/collect.scala | 66 ++++++++++++++++++++++++++++ base_tp/test/collectTest.scala | 45 +++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 base_tp/src/collection/collect.scala create mode 100644 base_tp/test/collectTest.scala diff --git a/base_tp/src/collection/collect.scala b/base_tp/src/collection/collect.scala new file mode 100644 index 0000000..acff4ff --- /dev/null +++ b/base_tp/src/collection/collect.scala @@ -0,0 +1,66 @@ +package ch.hepia.tpscala + + +/* Implémentez les fonctions suivantes. + */ +object Collect { + + case class Album( title: String, artist: String, year: Int ) + case class Duration( minutes: Int, seconds: Int ) + case class Track( title: String, duration: Duration ) + + val albums = List( + Album( "Mit Gas", "Tomahawk", 2003 ), + Album( "Pork Soda", "Primus", 1993 ), + Album( "Brown Album", "Primus", 1997 ), + Album( "Distraction Pieces", "Scroobius Pip", 2011 ) + ) + + val tracks = Map( + "Mit Gas" -> List( + Track( "Mayday", Duration( 3, 32 ) ) + ), + "Pork Soda" -> List( + Track( "DMV", Duration( 4, 58 ) ), + Track( "Mr. Krinkle", Duration( 5, 27 ) ) + ), + "Brown Album" -> List( + Track( "Fisticuffs", Duration( 4, 25 ) ), + Track( "Camelback Cinema", Duration( 4, 0 ) ), + Track( "Kalamazoo", Duration( 3, 31 ) ) + ), + "Distraction Pieces" -> List( + Track( "Let 'Em Come", Duration( 4, 25 ) ), + Track( "Domestic Silence", Duration( 3, 58 ) ) + ) + ) + + /* Retourne la liste de morceaux associés à un artiste */ + def tracksOf( artist: String ): List[Track] = { + albums.filter(_.artist == artist).flatMap( a => tracks(a.title)) + } + + /* Retourne la liste de tous les morceaux de moins de 4 minutes */ + def shortTracks: List[Track] = { + tracks.flatMap(t => t._2).filter(t => t.duration.minutes < 4).toList + } + + /* Retourne les titres des morceaux antérieurs à une année */ + def titlesBefore( year: Int ): List[String] = { + albums.flatMap(a => if (a.year < year) tracks(a.title) else List()).map(_.title) + } + + /* Calcule la durée totale de tous les morceaux disponibles. + REMARQUE: on veut que les secondes soient inférieures à 60 mais les + minutes peuvent dépasser ce total. + */ + def totalDuration: Duration = { + var m = 0 + var s = 0 + tracks.flatMap(_._2).foreach(t => { + m += t.duration.minutes + s += t.duration.seconds + }) + Duration(m + s/60, s % 60) + } +} diff --git a/base_tp/test/collectTest.scala b/base_tp/test/collectTest.scala new file mode 100644 index 0000000..8cdbf15 --- /dev/null +++ b/base_tp/test/collectTest.scala @@ -0,0 +1,45 @@ +package ch.hepia.tpscala + +import org.scalatest.funsuite.AnyFunSuite + +import Collect._ + +class Collect6Suite extends AnyFunSuite { + + test( "tracksOf" ) { + assert( tracksOf("Justin Bieber").isEmpty ) + assert( tracksOf("Tomahawk") == List( Track( "Mayday", Duration( 3, 32 ) ) ) ) + assert( tracksOf("Primus").size == 5 ) + } + + test( "shortTracks" ) { + assert( + shortTracks.toSet == Set( + Track( "Mayday", Duration( 3, 32 ) ), + Track( "Kalamazoo", Duration( 3, 31 ) ), + Track( "Domestic Silence", Duration( 3, 58 ) ) + ) + ) + } + + test( "titlesBefore" ) { + assert( titlesBefore( 1928 ).size == 0 ) + assert( titlesBefore( 2020 ).size == 8 ) + assert( + titlesBefore( 2000 ).toSet == Set( + "DMV", + "Mr. Krinkle", + "Fisticuffs", + "Camelback Cinema", + "Kalamazoo" + ) + ) + } + + test( "totalDuration" ) { + assert( totalDuration == Duration( 34, 16 ) ) + } + + + +} -- GitLab