Forked from
joel.cavat / scala2020
7 commits ahead of the upstream repository.
-
Quentin Leblanc authoredQuentin Leblanc authored
6.collect.scala 2.04 KiB
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 ) {
def +(that: Duration): Duration = {
var min = this.minutes + that.minutes
var sec = (this.seconds+that.seconds)
if(sec > 60) {
min+=1
sec-=60
}
Duration(min, sec)
}
}
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{ a => a.artist == artist}.map{ a => a.title}.flatMap(tracks)
}
/* Retourne la liste de tous les morceaux de moins de 4 minutes */
def shortTracks: List[Track] = {
tracks.flatMap(_._2.filter(_.duration.minutes < 4)).toList
}
/* Retourne les titres des morceaux antérieurs à une année */
def titlesBefore( year: Int ): List[String] = {
albums.filter(_.year<year).map(_.title).flatMap(tracks).map(_.title)
}
/* Calcule la durée totale de tous les morceaux disponibles.
REMARQUE: ont veut que les secondes soient inférieures à 60 mais les
minutes peuvent dépasser ce total.
*/
def totalDuration: Duration = {
tracks.values.flatten.map(_.duration).reduce(_+_)
}