arrays - 在 iOS 中将包含范围的数组排序为字符串

标签 arrays swift string sorting

我在 sqlite 数据库中有一行数据,格式如下面的屏幕截图所示。

enter image description here

我已将所有这些值作为字符串存储在一个数组中。现在,我必须对数组中的对象进行排序,以便结果如下并将其显示在 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/

相关文章:

arrays - 计算导航 2d map (数组)的方向(向量)

javascript - 如何使用 D3.js 和 .运算符(operator)

ios - CAShapeLayer。直线穿过点吗?

ios - 呈现 ViewController 与添加 ViewController 作为子项有什么区别

java - 不使用 split 方法计算字符串中不在字符串数组中的单词数

arrays - Swift的String.count的BigO是什么?

php - Laravel 从 Controller 文件中的集合创建数组

swift - 为小字符使 SKLabelNode 的触摸区域更大

c - 如何交换两个字符串的第一个字符?两个字符串存储在指针数组中

c# - 如何在 string.Format() 中转义双花括号