如果您从不提供数字信息和字符串的外部来源获取此数组,则您必须自己从中提取数字。当然,如果你在某个时候有数字信息,你应该把它挂在 @matt says 上。
从字符串中取回数字信息的一种方法是在数组上使用flatMap,然后使用stringByTrimmingCharactersInSet 以去除字符串每一端的非数字字符。然后,您可以尝试从中创建一个 double 以创建一个新的 (String, Double) 元组数组,并使用 flatMap 过滤掉 nil 结果。例如:
let strings = ["foobar", "Hello (45.5 km)", "George St. (39.5 km)", "Salut (20.45 km)", "Bonjour (30 km)", "Hi (35 km)"]
let stringsWithNumbers = strings.flatMap {str in
// trim away the non numerical characters, and attempt to create a double from the result
Double(str.stringByTrimmingCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)).map {(string: str, number: $0)}
}
print(stringsWithNumbers) // [("Hello (45.5 km)", 45.5), ("George St. (39.5 km)", 39.5), ("Salut (20.45 km)", 20.449999999999999), ("Bonjour (30 km)", 30.0), ("Hi (35 km)", 35.0)]
请注意,这不适用于包含多个数字的字符串(尽管我想不出你会如何处理这种情况)。
如果你知道你的距离总是包含在圆括号中,你可以添加一些额外的代码来允许括号之外的数字,首先将字符串修剪到括号,然后修剪到数字。例如:
let strings = ["foobar", "5th Avenue (3 km)", "Hello (45.5 km)", "George St. (39.5 km)", "Salut (20.45 km)", "Bonjour (30 km)", "Hi (35 km)"]
let stringsWithNumbers:[(string:String, number:Double)] = strings.flatMap{str in
// the substring of the brackets
let brackets = str.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "()").invertedSet)
// the number within the brackets
let num = brackets.stringByTrimmingCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)
// attempt to create a double from the result
return Double(num).map {(string: str, number: $0)}
}
print(stringsWithNumbers) // [("5th Avenue (3 km)", 3.0), ("Hello (45.5 km)", 45.5), ("George St. (39.5 km)", 39.5), ("Salut (20.45 km)", 20.449999999999999), ("Bonjour (30 km)", 30.0), ("Hi (35 km)", 35.0)]
然后您可以使用sort 函数对该数组进行排序。例如:
let sorted = stringsWithNumbers.sort {$0.number < $1.number}.map{$0.string} // sort, then ditch the distance information
print(sorted) // ["5th Avenue (3 km)", "Salut (20.45 km)", "Bonjour (30 km)", "Hi (35 km)", "George St. (39.5 km)", "Hello (45.5 km)"]
如果您希望保留双精度字符串的元组,您可以删除末尾的 map。