Я пытаюсь извлечь список альбомов из экспорта списка воспроизведения iTunes.
Файл содержит список всех песен в каждом альбоме , и я хочу только 1 запись для альбома , отбрасывая названия песен.
Итак, мне нужно отфильтровать уникальные названия альбомов .
Я могу сделать это с помощью al oop удаление повторяющихся элементов до количества альбомов == 1.
Но было интересно, есть ли более элегантный способ добиться этого с помощью функций высшего порядка?
Вот массив 2D-песен:
var songs[[String]]
И структура внутреннего массива:
artist, album, song, ...
Альбом, пример массива дорожек песен:
["Beck", "Odelay", "Lord Only Knows"]
["Beck", "Odelay", "Hotwax"]
["Beck", "Odelay", "Derelict"]
После обработки должна быть только одна запись для " Odelay ":
["Beck", "Odelay", "Lord Only Knows"]
И здесь название песни не имеет значения, так как оно будет отброшено, как только я попаду в электронную таблицу Excel.
ADDITION (2.15):
Итак, вот итеративный способ достижения моей цели.
var songs = [[""]]
var uniqueAlbums = [[""]]
<code to load songs array here>
// grab list of unique album titles
let albumTitles = (Set(songs.map { $0[2] })).sorted()
var cnt = 0
for title in albumTitles {
// grab all songs for this album
let currentAlbum = songs.filter { $0[2] == title }
// loop thru songs till last song, then add only one entry per album to new array
for album in currentAlbum {
if cnt < currentAlbum.count - 1 {
cnt += 1
} else {
uniqueAlbums.append(album)
}
}
cnt = 0
}
// uniqueAlbums[] is now a filtered collection of songs[] with only 1 album per line
Было бы замечательно, если бы был SQL -подобный синтаксис для 2D-массивов, встроенных в swift, так как тривиально написать SQL код для выполнения sh this:
SELECT artist, DISTINCT album FROM songs ORDER BY album
Или используя индексы массива:
SELECT songs[0], DISTINCT songs[1] FROM songs ORDER BY songs[1]