在唯一元素上过滤STRINGS的ARRAY的阵列

问题描述 投票:0回答:2

我正在尝试从iTunes播放列表导出中提取专辑列表。

[文件具有每个专辑中所有歌曲的列表,而我想要每个专辑中只有1个条目,放弃歌曲标题。

所以,我需要过滤唯一专辑标题

我可以循环执行此操作,删除重复的元素,直到专辑数== 1。

但是想知道是否有更优雅的方法可以通过高阶函数来实现这一目标?

这里是2D歌曲数组:

var songs[[String]]

和内部数组的结构:

artist, album, song, ...

专辑,歌曲曲目数组示例:

("Beck", "Odelay", "Odelay")
("Beck", "Odelay", "Hotwax")
("Beck", "Odelay", "Derelict")

处理后,“ Odelay”应该只有一个条目:

("Beck", "Odelay", "Odelay")

添加(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

如果在swift中内置2D数组具有类似SQL的语法,那将很整齐,因为编写SQL代码来完成此任务很简单:

SELECT artist, DISTINCT album FROM songs ORDER BY album

或使用数组下标:

SELECT songs[0], DISTINCT songs[1] FROM songs ORDER BY songs[1]
arrays swift4 higher-order-functions
2个回答
0
投票

这里是从二维数组中获取唯一的数组数据

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

0
投票

使用它从2D数组中删除重复项,并以2D数组的形式接收具有唯一值的响应:

let tempSongs = songs.map({Array(Set($0))})
© www.soinside.com 2019 - 2024. All rights reserved.