Arrays 在iOS中将包含范围的数组排序为字符串
我在sqlite数据库中有一行范围格式的数据,如下面的屏幕截图所示 我已将所有这些值作为字符串存储在数组中。现在,我必须对数组中的对象进行排序,以便结果如下所示,并将其显示在表视图中Arrays 在iOS中将包含范围的数组排序为字符串,arrays,swift,string,sorting,Arrays,Swift,String,Sorting,我在sqlite数据库中有一行范围格式的数据,如下面的屏幕截图所示 我已将所有这些值作为字符串存储在数组中。现在,我必须对数组中的对象进行排序,以便结果如下所示,并将其显示在表视图中 我认为,如果你只有100个这样的条目,那么很难创建一个缓慢的算法。您几乎可以做任何您想做的事情,但无法识别任何性能影响-至少不能以毫秒为单位 如果您拥有大量数据,并且经常进行排序(例如,排序的频率高于数据更改的频率),一种解决方案是对数据库进行非规范化: 创建一个单独的行normalizedLength或其他内
我认为,如果你只有100个这样的条目,那么很难创建一个缓慢的算法。您几乎可以做任何您想做的事情,但无法识别任何性能影响-至少不能以毫秒为单位 如果您拥有大量数据,并且经常进行排序(例如,排序的频率高于数据更改的频率),一种解决方案是对数据库进行非规范化:
- 创建一个单独的行
或其他内容normalizedLength
- 解析所有数据,将“90-130 cm”之类的值转换为整数值
并将其存储到90
normalizedLength
- 对于那些“>…”和“<…”值,使用
和Int.max
Int.min
这必须为所有数据执行一次。然后,您可以对其进行多次排序。虽然这可能不是最优雅的解决方案,但您可以通过检查每个字符串的第一个元素,从而实现所需的排序:
var arr = ["240 - 300 cm", "400 - 600 cm ", "90 - 130 cm", "<10 cm", ">700 cm"]
func sortMyArray(_ array: [String]) -> [String] {
var lessThanElements = [String]()
var defaultPatternElements = [String]()
var greaterThanElements = [String]()
for srting in array {
switch srting.first! {
case "<":
lessThanElements.append(srting)
case ">":
greaterThanElements.append(srting)
default:
defaultPatternElements.append(srting)
}
}
return lessThanElements.sorted() + defaultPatternElements.sorted() + greaterThanElements.sorted()
}
let sortedArray = sortMyArray(arr)
print(sortedArray) // ["<10 cm", "240 - 300 cm", "400 - 600 cm ", "90 - 130 cm", ">700 cm"]
var arr=[“240-300厘米”、“400-600厘米”、“90-130厘米”、“700厘米”]
func sortMyArray(u数组:[String])->[String]{
var lessThanElements=[String]()
var defaultPatternElements=[String]()
var greaterThanElements=[String]()
用于阵列中的srting{
先把开关打开{
案例“”:
greaterThanElements.append(srting)
违约:
defaultPatternElements.append(srting)
}
}
返回lessThanElements.sorted()+defaultPatternElements.sorted()+greaterThanElements.sorted()
}
让SortMarray=SortMarray(arr)
打印(光线)//[“700厘米”]
请注意,如果字符串的第一个字符不是“”,它将被视为
defaultpatternements
元素。此解决方案检查字符串的第一个字符。如果可以转换为Int
,请使用整个字符串,如果不能转换,请删除第一个字符并使用它。然后使用选项numeric
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)
让arr=[“240-300厘米”、“400-600厘米”、“90-130厘米”、“700厘米”]
设arr1=arr.sorted{(str1,str2)->Bool-in
设lhs=Int(str1.prefix(1))==nil?字符串(str1.dropFirst()):str1
设rhs=Int(str2.prefix(1))==nil?字符串(str2.dropFirst()):str2
返回rhs.compare(lhs,选项:。数值)=.orderedDescending
}
打印(arr1)
问题:如果字符串以“”开头,是否意味着它应该始终是排序数组中的最后一个元素?是的@Ahmad F,我查看了更多此类范围数据的示例,我非常确定在小于()运算符之前不会有任何数据。它们表示列表的最小和最大限制。您的意思是说创建单独的列normalizedLength,并在数据90-130旁边的列中存储ex.90的下限,并根据normalizedLength进行排序。是的。由于范围不重叠(我猜),所以只有下限是相关的。很好的尝试。谢谢
var arr = ["240 - 300 cm", "400 - 600 cm ", "90 - 130 cm", "<10 cm", ">700 cm"]
func sortMyArray(_ array: [String]) -> [String] {
var lessThanElements = [String]()
var defaultPatternElements = [String]()
var greaterThanElements = [String]()
for srting in array {
switch srting.first! {
case "<":
lessThanElements.append(srting)
case ">":
greaterThanElements.append(srting)
default:
defaultPatternElements.append(srting)
}
}
return lessThanElements.sorted() + defaultPatternElements.sorted() + greaterThanElements.sorted()
}
let sortedArray = sortMyArray(arr)
print(sortedArray) // ["<10 cm", "240 - 300 cm", "400 - 600 cm ", "90 - 130 cm", ">700 cm"]
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)