【问题标题】:How can i make a 2 dimensional array out of 2 1 dimensional arrays in Swift 2如何在 Swift 2 中从 2 个 1 维数组中创建一个 2 维数组
【发布时间】:2018-01-07 13:25:00
【问题描述】:

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

我正在开发音乐播放器。我有一个持久ID(UInt64)的一维数组,我稍后存储和读取。我可以使用每一个来找到它们对应的专辑标题并将它们存储在一维数组(字符串)中。我的目标是按顺序组合它们,然后按专辑标题对它们进行排序。之后,我想提取现在以不同顺序排列的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]

我无法创建未排序的二维数组。我在这个网站上找到了以下代码,并认为我可以尝试调整它,但一直收到错误:Expected '{' to start the body of for-each loop

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)))
    }
}

我花了一天的大部分时间试图弄清楚这一点。

提前谢谢!

【问题讨论】:

  • zip 函数在您的 Swift 版本中可用吗?我认为它至少在 Swift 2.2 中可用(不确定),而且我认为你想用它来将两个数组组合成一个元组数组。
  • 是的,zip 功能可用。 Xcode 7.3.1。我必须学习元组。非常感谢您的帮助!

标签: swift sorting multidimensional-array


【解决方案1】:

创建二维数组

    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")]

【讨论】:

  • 谢谢!!!这行得通!我必须对排序行做一个小改动:让 sorted2DArray = array2D.sort { $0.1
【解决方案2】:

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

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 元组的一维数组将完成它。感谢您的帮助!
【解决方案3】:

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

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 中获取),您也可以将一些值设为可选。

结论:跳到 Swift 3,或者采用上面的类!

【讨论】:

  • 我非常感谢您的帮助!我将在沙箱中研究您的代码。事实证明,这可能是最好的方法。我只想添加一些更简单的东西,然后我可以保存它,并转换为 Swift 3(很快就会有 Swift 4)。非常感谢。
  • 我指的是游乐场而不是沙盒。
  • 别担心,希望一切顺利!如果它最终有帮助,请点赞!
猜你喜欢
  • 2013-07-16
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 2022-07-30
  • 2021-05-13
  • 2021-12-01
  • 2013-08-31
相关资源
最近更新 更多