我在 sqlite 数据库中有一行数据,格式如下面的屏幕截图所示。
我已将所有这些值作为字符串存储在一个数组中。现在,我必须对数组中的对象进行排序,以便结果如下并将其显示在 TableView 中。
<10 厘米
90 - 130 厘米
240 - 300 厘米
400 - 600 厘米
'>700 厘米
我已经尝试了一些代码。
示例代码 1:
var arr = ["240 - 300 cm", "400 - 600 cm ", "90 - 130 cm", "<10 cm", ">700 cm"]
var arr1 = arr.sorted{$0 < $1}
但是,这种方法似乎适用于包含字母数字字符的字符串。所以,我尝试了另一种方法。
示例代码 2:
var arr1 = [NSValue.init(range: NSMakeRange(240, 300)), NSValue.init(range: NSMakeRange(400, 600)), NSValue.init(range: NSMakeRange(90, 130))]
var arr2 = arr1.sorted{$0.rangeValue.location < $1.rangeValue.location}
for range in arr2 {
print("\(range.rangeValue.location) - \(range.rangeValue.length) cm")
}
但是,为了使这种方法起作用,我必须执行以下操作:
根据要求以格式(例如 90 - 130 厘米)处理数据,以便我可以将其混合以适合 NSRange。
对于 <10 厘米和 >700 厘米的值,我必须单独处理。可能是,通过在数组排序后将这些值插入到第一个索引和最后一个索引中,尚未尝试。
数组排序后,再次以正确的格式打印值,这是我在上面的示例代码中使用 for 循环完成的。
该方法似乎需要在大量时间消耗和操作之间进行权衡。不知道如果有100行这样的数据,性能会如何。
我的问题是,在 iOS 中是否有更好、更简洁的方法对范围格式的数据进行排序?
非常感谢任何帮助。
最佳答案
此解决方案检查字符串的第一个字符。如果它可以转换为 Int
,则使用整个字符串,如果不能,则删除第一个字符并使用它。然后使用选项 numeric
compare
排序
let arr = ["240 - 300 cm", "400 - 600 cm ", "90 - 130 cm", "<10 cm", ">700 cm"]
let arr1 = arr.sorted { (str1, str2) -> Bool in
let lhs = Int(str1.prefix(1)) == nil ? String(str1.dropFirst()) : str1
let rhs = Int(str2.prefix(1)) == nil ? String(str2.dropFirst()) : str2
return rhs.compare(lhs, options: .numeric) == .orderedDescending
}
print(arr1)
关于arrays - 在 iOS 中将包含范围的数组排序为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49994771/