Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
ae0efe0756
|
|||
7f01af5d93
|
|||
3d52397ef8
|
|||
0c34a2df52
|
|||
00336f0b55
|
|||
5b1bd3e135
|
@ -31,7 +31,11 @@ enum MusicGenre:
|
|||||||
case Rock, Soul, Blues, Folk, Funk, Reggae, HipHop, NewWave, Electro, Metal
|
case Rock, Soul, Blues, Folk, Funk, Reggae, HipHop, NewWave, Electro, Metal
|
||||||
|
|
||||||
// Define an Album with a union between a String and a MusicGenre
|
// Define an Album with a union between a String and a MusicGenre
|
||||||
class Album(title: String, label: String, genre: String|MusicGenre)
|
class Album(title: String, label: String, genre: String|MusicGenre) {
|
||||||
|
def getGenre(): String | MusicGenre = {
|
||||||
|
genre
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class Streak(val s: String) {
|
class Streak(val s: String) {
|
||||||
val streak: Option[Int] = {
|
val streak: Option[Int] = {
|
||||||
@ -83,28 +87,55 @@ case class TopSongs(songs: List[Song] = List()) {
|
|||||||
TopSongs(song :: songs)
|
TopSongs(song :: songs)
|
||||||
}
|
}
|
||||||
def printSongs(): Unit = {
|
def printSongs(): Unit = {
|
||||||
songs.foreach(song => {
|
songs.map(song => {
|
||||||
val title = song.title
|
val title = song.title
|
||||||
val singer = song.singer
|
val singer = song.singer
|
||||||
val producers = song.producer.map(_.create()).mkString(", ")
|
val producers = song.producer.map(_.create()).mkString(", ")
|
||||||
val streak = song.rank._1.streak.getOrElse("no")
|
val streak = song.rank._1.streak.getOrElse("no")
|
||||||
val pos = song.rank._2.pos.getOrElse("NA")
|
val pos = song.rank._2.pos.getOrElse("NA")
|
||||||
|
|
||||||
if (singer.exists(a => {
|
singer match {
|
||||||
a.isInstanceOf[God]
|
case s if s.exists(_.person.isInstanceOf[God]) => println(s"$title by God ${singer.map(_.person.name).mkString(", ")} spent $streak weeks on the charts on Pos. $pos")
|
||||||
})) {
|
case _ => println(
|
||||||
println(s"$title by God ${singer.map(_.person.name).mkString(", ")} spent $streak weeks on the charts on Pos. $pos")
|
|
||||||
} else {
|
|
||||||
println(
|
|
||||||
s"$title by ${singer.map(_.person.name).mkString(", ")}. " +
|
s"$title by ${singer.map(_.person.name).mkString(", ")}. " +
|
||||||
s"$producers this song that " +
|
s"$producers this song that " +
|
||||||
s"spent $streak weeks " +
|
s"spent $streak weeks " +
|
||||||
s"on the charts on Pos. $pos"
|
s"on the charts on Pos. $pos"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This function filter the songs by a specific music gender
|
||||||
|
def filterByGenre(genre: MusicGenre): List[Song] = {
|
||||||
|
songs.filter(song => song.album.exists(_.getGenre() == genre))
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function counts the number of songs by each artist
|
||||||
|
// It uses flatMap to extract the artist names from the songs
|
||||||
|
// Then it groups the songs by artist name and counts the occurrences
|
||||||
|
// Finally, it returns a map with the artist names as keys and the counts as values
|
||||||
|
def countSongsByArtist(): Map[String, Int] = {
|
||||||
|
songs.flatMap(_.singer.map(_.person.name))
|
||||||
|
.groupBy(identity)
|
||||||
|
.view.mapValues(_.size)
|
||||||
|
.toMap
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function return the song spent the most weeks on the chart
|
||||||
|
// It uses reduce to find the song with the maximum streak value
|
||||||
|
def longestStreak(): Song = {
|
||||||
|
songs.reduce((s1, s2) => {
|
||||||
|
if (s1.rank._1.streak.getOrElse(0) > s2.rank._1.streak.getOrElse(0)) s1 else s2
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function returns the top N songs by weeks on chart
|
||||||
|
// It sorts the songs by the streak value in descending order and takes the top N songs
|
||||||
|
def topNSongsByWeeks(n: Int): List[Song] = {
|
||||||
|
songs.sortBy(song => -song.rank._1.streak.getOrElse(0)).take(n)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@main def main(): Unit =
|
@main def main(): Unit =
|
||||||
@ -141,3 +172,32 @@ case class TopSongs(songs: List[Song] = List()) {
|
|||||||
|
|
||||||
// print the songs
|
// print the songs
|
||||||
topSongs.printSongs()
|
topSongs.printSongs()
|
||||||
|
|
||||||
|
println("----------")
|
||||||
|
|
||||||
|
// print the number of songs by artist
|
||||||
|
val songsByArtist = topSongs.countSongsByArtist()
|
||||||
|
println("Number of songs by artist:")
|
||||||
|
songsByArtist.foreach {
|
||||||
|
case (artist, count) => println(s"$artist: $count")
|
||||||
|
}
|
||||||
|
|
||||||
|
println("----------")
|
||||||
|
|
||||||
|
// print the longest streak
|
||||||
|
val longestStreakSong = topSongs.longestStreak()
|
||||||
|
println(s"Longest streak: ${longestStreakSong.title} by ${longestStreakSong.singer.map(_.person.name).mkString(", ")} - ${longestStreakSong.rank._1.streak.getOrElse(0)} weeks")
|
||||||
|
|
||||||
|
println("----------")
|
||||||
|
|
||||||
|
// print the top N songs by weeks on chart
|
||||||
|
val topNSongs = topSongs.topNSongsByWeeks(5)
|
||||||
|
println("Top N songs by weeks on chart:")
|
||||||
|
topNSongs.foreach { song =>
|
||||||
|
println(s"${song.title} by ${song.singer.map(_.person.name).mkString(", ")} - ${song.rank._1.streak.getOrElse(0)} weeks")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user