Arrays Swift-将版本数组排序为字符串

Arrays Swift-将版本数组排序为字符串,arrays,string,swift,compare,Arrays,String,Swift,Compare,我有一个随机排列的字符串数组(应用程序版本),如下所示: var arrayOfStrings = ["2.12.5", "2.12.10", "2.2", "2.11.8"] 排序后的数组应为[“2.2”、“2.12.10”、“2.12.5”、“2.11.8”](按最近的排序)。我正试着把它分类 编辑:我的错,排序的数组实际上应该是[“2.12.10”、“2.12.5”、“2.11.8”、“2.2”]。使用上面的解决方案 //Compare by string array.sortInPla

我有一个随机排列的字符串数组(应用程序版本),如下所示:

var arrayOfStrings = ["2.12.5", "2.12.10", "2.2", "2.11.8"]
排序后的数组应为[“2.2”、“2.12.10”、“2.12.5”、“2.11.8”](按最近的排序)。我正试着把它分类

编辑:我的错,排序的数组实际上应该是[“2.12.10”、“2.12.5”、“2.11.8”、“2.2”]。使用上面的解决方案

//Compare by string
array.sortInPlace({ //This returns ["2.2", "2.12.5", "2.12.10", "2.11.8"]
    $0 > $1
})

//Compare by int
array.sortInPlace({ //This returns ["2.12.10", "2.12.5", "2.11.8", "2.2"]
    Int($0.stringByReplacingOccurrencesOfString(".", withString: "")) > Int($1.stringByReplacingOccurrencesOfString(".", withString: ""))
})

所有这些都不能正常工作。返回正确数组的最佳方法是什么?

您必须将版本字符串拆分为其组件,将其转换为数字并比较其数值。试试这个:

var arrayOfStrings = ["2.12.5", "2.12.10", "2.2", "2.11.8"]

arrayOfStrings.sortInPlace {
    let v0 = ($0 as NSString).componentsSeparatedByString(".")
    let v1 = ($1 as NSString).componentsSeparatedByString(".")

    for i in 0..<min(v0.count, v1.count) {
        if v0[i] != v1[i] {
            return Int(v0[i]) < Int(v1[i])
        }
    }

    return v0.count < v1.count
}
var arrayOfStrings=[“2.12.5”、“2.12.10”、“2.2”、“2.11.8”]
索丁广场arrayOfStrings.sortInPlace{
设v0=($0作为NSString)。组件由字符串(“.”)分隔
设v1=($1作为NSString)。组件由字符串(“.”)分隔

对于0..中的i,最简单的选择是使用
比较
。NumericSearch

arrayOfStrings.sortInPlace { $0.compare($1, options: .NumericSearch) == .OrderedAscending }
显然,如果您希望它按降序排列,请使用
.OrderedDescending

Swift 4版本:

var arrayOfStrings = ["2.12.5", "2.12.10", "2.2", "2.11.8"]

arrayOfStrings.sorted { (lhs, rhs) in
    let lhsc = lhs.components(separatedBy: ".")
    let rhsc = rhs.components(separatedBy: ".")
    for i in 0..<min(lhsc.count, rhsc.count) where lhsc[i] != rhsc[i] {
        return (Int(lhsc[i]) ?? 0) < (Int(rhsc[i]) ?? 0)
    }
    return lhsc.count < rhsc.count
}
var arrayOfStrings=[“2.12.5”、“2.12.10”、“2.2”、“2.11.8”]
arrayOfStrings.sorted{(lhs,rhs)in
设lhsc=lhs.组件(用“.”分隔)
设rhsc=rhs.组件(用“.”分隔)
对于0..Swift 4.2中的i:

var arrayOfStrings = ["1.2.1", "1.0.6", "1.1.10"]
arrayOfStrings.sort { (a, b) -> Bool in
    a.compare(b, options: String.CompareOptions.numeric, range: nil, locale: nil) == .orderedAscending
}
print(arrayOfStrings) // ["1.0.6", "1.1.10", "1.2.1"]

可能的重复不是重复,因为我没有要求按属性值对数组进行排序您甚至不需要强制转换到
NSString
,它会自动桥接。这似乎是一种很好的方法,但它返回[“2.2”、“2.11.8”、“2.12.5”、“2.12.10”]“2.2”应该是最后一个。@JohnDoe不,
2.2
应该是第一个。在软件版本控制中,2.2与2不同。20@CodeDifferent在软件版本控制中,“2.2”不是紧跟在“2.12.10”之后吗?不,看看Mac OS X版本这个解决方案的问题是它将“2.2”排序为“2.11.8”(因为2“2.11.8”@JohnDoe通常不是“2.2”通常指“2.11”之前的大调2、小调2——大调2、小调11.9小调版本自“2.2”以来已经通过@JohnDoe-参见中的第2点。这种语义版本控制是像Carthage这样的依赖项管理器所使用的。版本编号当然有不同的标准,但常见的惯例是2.2<2.11。糟糕,你们是对的。2.2在2.11之前,这是排序数组的最简单方法。标记为正确的解决方案。谢谢s!@Rob我不明白的是它是如何将两个版本号与
.NumericSearch
进行比较的。是否覆盖了该选项以比较字符串中的整数集?非常方便。