如何在Swift 2

时间:2017-07-31 20:40:58

标签: swift sorting multidimensional-array

我知道我需要离开Swift 2,但我95%并认为我会在转换之前完成。

我正在制作音乐播放器。我有一个一维的persistentIDs数组(UInt64),我将在后面存储和读取。我可以使用每一个找到相应的albumTitle并将它们存储在一维数组(String)中。我的目标是按顺序组合它们,然后按albumTitle对它们进行排序。之后我想提取现在使用不同顺序的persistentID。

var array1: [UInt64] = [UInt64]()    // Ex: [1, 2, 3, 4, 5]
var array2: [String] = [String]()    // Ex: [d, a, e, b, c]
var array2D:[(UInt64, String)] = []

// Unsorted 2D array ex: [[1,d], [2,a], [3,e], [4,b], [5,c]]

// Sorted 2D array ex: [[2,a], [4,b], [5,c], [1,d], [3,e]]

// Final 1D array ex: [2, 4, 5, 1, 3]

我无法创建未排序的2D数组。我在这个网站上找到了以下代码,并认为我可以尝试对其进行调整,但不断得到错误:预期'{'启动for-each循环的主体

var N: Int
var array: [[Int]] = []
for row in 0..<N {
    // Append an empty row.
    array.append([Int]())

    for _ in 0..<N {
        // Populate the row.
        array[row].append(Int(arc4random_uniform(100)))
    }
}

我花了一天的时间来试图解决这个问题。

提前致谢!

3 个答案:

答案 0 :(得分:2)

创建2D数组

    let array1: [UInt64] = [1, 2, 3, 4, 5]

    let array2: [String] = ["d", "a", "e", "b", "c"]

    var array2D = Array(zip(array1, array2))

    print(array2D); // [(1,"d"), (2,"a"), (3,"e"), (4,"b"), (5,"c")]

排序方法

    array2D.sort { $0.1 < $1.1 }

    print(array2D); // [(2, "a"), (4, "b"), (5, "c"), (1, "d"), (3, "e")]

答案 1 :(得分:1)

这将为您提供“未排序的数组”:

var array1: [UInt64] = [1, 2, 3, 4, 5]
var array2: [String] = ["d", "a", "e", "b", "c"]

var array2D = Array(zip(array1, array2))  // [(1,"d"), (2,"a"), (3,"e"), (4,"b"), (5,"c")]

不是说这不是二维数组。它仍然是一个2元组的一维数组。

“排序数组”的含义不明确

答案 2 :(得分:1)

首先。在Swift 2中,数组在存储内容方面比字典更有效,因此限制了性能平衡的选择。 Swift 3在此方面做出了重大改进,缩小了性能差距。 正因为如此:正如之前的帖子所指出的,你的2D数组只不过是一个由两个元组组成的数组。这带来了以下问题:您必须检查2D数组中每个1D数组的每个元素的类型,以了解哪个值是id和标题。您的2D数组可以简单地制作成一个字典/对象数组。这是你应该从一开始就做的事情:使用一个可以追踪事物的类,以便于操作。这可以避免您的问题混淆,这可能发生在本地存储然后再检索。请注意,这适用于中小型列表,否则,您需要更好的逻辑或更大的列表的不同方法。但是,像这样的东西总是很好地开始:

class Track {

    var id : UInt64
    var title : String

    init(id: UInt64, title: String) {
        self.id = id
        self.title = title
    }
}

class Playlist {

    var name = String()

    var playlistId : UInt64?

    var tracks : [Track] = []

    private var indexes : [String:Int] = [:]

    private var idList : [UInt64:String] = [:]

    init(name: String, tracks: [Track]?) {
        self.name = name
        if let t = tracks {
            for track in t {
                addSongWithoutOrdering(track)
            }
            orderSongs()
        }
    }

    private func addSongWithoutOrdering(_ song: Track) {
        tracks.append(song)
    }

    func addSong(_ track: Track) {
        tracks.append(track)
        orderSongs()
        print("Added song titled: \(track.title) to playlist : \(name)")
    }

    func removeSongBy(_ id: UInt64) {
        if let title = idList[id], let index = indexes[title] {
            idList.removeValue(forKey: id)
            indexes.removeValue(forKey: title)
            tracks.remove(at: index)
            orderSongs()
        } else {
            print("No song with id: \(id) exists in playlist : \(name)")
        }
    }

    func removeSongBy(_ title: String) {
        if let index = indexes[title] {
            idList.removeValue(forKey: tracks[index].id)
            indexes.removeValue(forKey: title)
            tracks.remove(at: index)
            orderSongs()
        } else {
            print("Removed song with title: \(title) in playlist : \(name)")
        }
    }

    private func orderSongs () {
        tracks.sort { $0.title < $1.title }
        for (index, track) in tracks.enumerated() {
            indexes[track.title] = index
            idList[track.id] = track.title
        }
    }

}

通过执行此操作,您还可以将播放列表,播放列表组等排序。如果你不能立即访问它们,你也可以制作一些值选项(即,它们需要从API获取)。

Conlusion:跳转到Swift 3,或采用类似上面的类!