【问题标题】:SWIFT how to sort 2D array in 2nd dimension without having to transposeSWIFT如何在二维中对二维数组进行排序而无需转置
【发布时间】:2020-06-05 16:42:01
【问题描述】:

有没有办法对二维数组进行排序,这样

[[9,8,7]
 [6,1,4]]

变成

[[7,8,9]
 [4,1,6]]

我正在为结构图构建表格

var graphPoints = [[Double]]()
graphPoints.append(jsonResult!.highscoreRecord.map { ($0.Date.timeIntervalSince1970) })
graphPoints.append(jsonResult!.highscoreRecord.map { Double($0.Score) })
graphPoints.append(jsonResult!.highscoreRecord.map { Double($0.avDuration) })
graphPoints.append(jsonResult!.highscoreRecord.map { Double($0.Tries) })
// var sortedGraphPoints = graphPoints.sort { ($0[0]) < ($1[0]) }
var sortedGraphPoints = graphPoints.sort { ([0]$0) < ([0]$1) }

但是,标记为注释的行会针对每个内部数组的第一个元素进行排序,这意味着它会对每个数据集中的值进行排序,而不是按日期对所有数据集进行排序。

最后一行导致错误“二元运算符'

我找到了一些代码来转置数组。但我并不真正理解代码(我是 Swift 新手),我更愿意保留结构。

【问题讨论】:

  • 这是一段真的奇怪的代码。你到底想达到什么目的?
  • 所以你想保持 7 和 4、8 和 1、9 和 4 之间的关联不变?如果是这样,最好将它们放在结构或元组中
  • @Alexander-ReinstateMonica 抱歉 :-) 所以,我正在将一个 JSON 文件读入一个变量(jsonResult)。此变量基于一个结构,其中包含一个名为 highscoreRecord 的数组。该数组包含一个包含日期、分数等元素的子结构。现在我想随着时间的推移绘制分数等。所以我把它存储在graphPoints中。现在我想按日期排序
  • @Gereon 完全正确。从我的数组中填充结构是否与填充数组一样有效?我很高兴知道如何做到这一点:-) 这里包含的复杂性是从 date() 到 double 的类型转换,以使下游计算更容易
  • @w461 我理解代码,但奇怪的是你拥有所有这些丰富的类型数据(名称如 TriesDateavDuration 等) ,您将其折叠成一堆数组(丢失所有这些),然后想知道如何按您刚刚丢弃的数据进行排序。 Gereon 为您指明了一个好的方向。不要过早序列化您的数据。在将其发送到外部系统(图形库、Web 请求等)之前的最后一步执行此操作

标签: arrays swift sorting


【解决方案1】:

从您的问题中很难看出,但显然您的数据已经组织在一个看起来像这样的结构中:

struct HighscoreRecord: Decodable {
    let date: Date
    let score: Int
    let avDuration: Int
    let tries: Int
}

而您的 jsonResult!.highscoreRecord[HighscoreRecord] 类型。

如果您绝对需要将它们转换为您的 graphPoints 数组,您应该在转换之前简单地进行排序,因为它非常简单:

let sortedRecords = jsonResult!.highscoreRecord.sorted { $0.date < $1.date }

然后将其用作map 调用的输入。

PS:尽量避免通过! 强制解包。

【讨论】:

  • 天才!这是一个简单的解决方法!不确定是否有比转换为 graphPoints 更简单的方法。我花费了 99% 的大脑来理解 Swift 和面向对象的编程。我的 C 语言非常好,后来我用 VBA 做了一些简单的 OOP。但现在情况不同了……
猜你喜欢
  • 2013-08-17
  • 2017-05-25
  • 2020-05-06
  • 2013-09-13
  • 2015-09-17
  • 2021-11-07
  • 1970-01-01
相关资源
最近更新 更多