Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在iOS中将包含范围的数组排序为字符串_Arrays_Swift_String_Sorting - Fatal编程技术网

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

Arrays 在iOS中将包含范围的数组排序为字符串,arrays,swift,string,sorting,Arrays,Swift,String,Sorting,我在sqlite数据库中有一行范围格式的数据,如下面的屏幕截图所示 我已将所有这些值作为字符串存储在数组中。现在,我必须对数组中的对象进行排序,以便结果如下所示,并将其显示在表视图中 我认为,如果你只有100个这样的条目,那么很难创建一个缓慢的算法。您几乎可以做任何您想做的事情,但无法识别任何性能影响-至少不能以毫秒为单位 如果您拥有大量数据,并且经常进行排序(例如,排序的频率高于数据更改的频率),一种解决方案是对数据库进行非规范化: 创建一个单独的行normalizedLength或其他内

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

我已将所有这些值作为字符串存储在数组中。现在,我必须对数组中的对象进行排序,以便结果如下所示,并将其显示在表视图中


我认为,如果你只有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)