【问题标题】:Sort Two Dimensional Array in Swift [closed]在 Swift 中对二维数组进行排序 [关闭]
【发布时间】:2020-05-06 10:48:05
【问题描述】:
var financeArray = [[Any]]()

//some code here to populate financeArray

print("financeArray:\(financeArray)") 

结果:

[["VF009", 416052.545002.62],
 ["VF003", 318095.705914636],
 ["B005", 142228.01838465 5],
 ["VF010", 198340.167128308],
 ["VF002", 467586.9413639],
 ["VF001", 9347271404463.13],
 ["B002", 142546.55683996],
 ["VF011", 443370.11349.86],
 ["VF008", 92280.41684],
 ["VF012", 367211.3614995],
 ["VF004", 392188.90705226.39],
 ["VF007", 179616.3264362.1],
 ["VF006", 462121.40585729457.33],
 ["VF005", 151343.09298267]]

我需要按照以 VF 开头的代码对这个数组进行排序。我已经搜索了互联网并找到了一些解决方案,但我通常会在下面得到错误。

Binary operator '<' cannot be applied to two 'Any' operands

期望的结果是:

[["B002", 142546.55683996],
["B005", 142228.01838465 5],
["VF001", 9347271404463.13],
["VF002", 467586.9413639],
["VF003", 318095.705914636],
["VF004", 392188.90705226.39],
["VF005", 151343.09298267],
["VF006", 462121.40585729457.33],
["VF007", 179616.3264362.1],
["VF008", 92280.41684],
["VF009", 416052.545002.62],
["VF010", 198340.167128308],
["VF011", 443370.11349.86],
["VF012", 367211.3614995]]

【问题讨论】:

  • 那么以 B 开头的代码呢?
  • 到目前为止您尝试过什么?显示代码
  • 让您的生活更轻松摆脱[Any] 的数组并使用code: Stringvalue: Double 属性创建结构
  • 以 B 字母开头的代码无关紧要,因为一旦我对数组进行排序,它将按以下顺序进行:“特殊字符、字母数字字符和数字”我知道我必须使用结构,但 API I使用完全是痛苦的。 API在没有数据时返回Integer,在有数据时返回String。这是我尝试的最后一件事: let sortedArr = financeArray.sorted(by: {$0.first
  • 错误说明了它本身,你的数据类型是“任何”,你不能在上面使用二元运算符。你应该把它转换成一些类似的类型,然后它就会工作

标签: ios arrays swift iphone sorting


【解决方案1】:

首先,您应该正确定义数据的结构,因此它不依赖于Any 的数组。正如您的错误所说,编译器不知道如何比较 Any 类型的东西。现在,我不明白你的数据是如何工作的,所以让我用一个虚构的例子来告诉你排序是如何完成的。

比方说,我们有一些基于以下数据结构的数据:

struct Product {
    let title: String
    let price: Double
}

让我们创建一些数据:

let products = [
    Product(title: "Car", price: 12.5),
    Product(title: "Watch", price: 5.5)
]

现在您可以轻松地对产品进行分类:

let sorted = products.sorted { $0.price < $1.price }

这里按升序排列。希望您明白为什么以强类型的方式构建数据可以使您的代码更易于使用。

【讨论】:

  • 我知道这是最好的解决方案,但无论如何我有自己的理由使用 Any。谢谢!
  • @OsmanTüfekçi 没有理由足以使用它。顺便说一句 416052.545002.62 它不是有效的 Double。编辑您的问题并添加您的真实代码
【解决方案2】:

您收到错误是因为二元运算符“

因此需要将类型转换为所需的类型

var financeArray = [[Any]]()
 financeArray = [["VF009", "416052.545002"],["VF003", "318095.705914636"],["B005", "142228.01838465"],["VF010", "198340.167128308"],["VF002", "467586.9413639"],["VF001", "9347271404463.13"],["B002", "142546.55683996"]]

let sortedArray  = financeArray.sorted(by: {($0[0] as! String) < ($1[0] as! String) })
print(sortedArray) //results = [["B002", "142546.55683996"], ["B005", "142228.01838465"], ["VF001", "9347271404463.13"], ["VF002", "467586.9413639"], ["VF003", "318095.705914636"], ["VF009", "416052.545002"], ["VF010", "198340.167128308"]]

【讨论】:

  • 我知道我应该将 Any 转换为 String,但我不知道在哪里使用“as!String” 作为没有 Senior 的 Junior 令人筋疲力尽,我不敢相信我错过了这一点。无论如何,谢谢。
  • 如果有任何子数组为空或者它的第一个元素不是字符串,这将崩溃
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 2013-08-17
  • 2017-05-25
  • 2015-09-17
相关资源
最近更新 更多