我正在尝试从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]
这里是从二维数组中获取唯一的数组数据
let uniueSongs = Array(Set(songs.flatMap{$0}))
使用它从2D数组中删除重复项,并以2D数组的形式接收具有唯一值的响应:
let tempSongs = songs.map({Array(Set($0))})