фильтр ARRAY ARRAY из STRINGS на уникальном элементе - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь извлечь список альбомов из экспорта списка воспроизведения 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]

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Используйте это для удаления дубликатов из вашего 2D-массива и получения ответа в виде 2D-массива с уникальными значениями:

let tempSongs = songs.map({Array(Set($0))})
0 голосов
/ 13 февраля 2020

Здесь можно получить уникальные данные массива из двумерного массива

let uniueSongs = Array(Set(songs.flatMap{$0}))
...