此代码用于将字符串数组按首字母分组。
//plain array
var list = ["apple", "apricot", "banana", "blackberry"]
//dictionary of arrays
var dict = Dictionary<String, Array<String>>()
//create necessary keys from first characters
for word in list {
dict[ String( word.characters.prefix(1) ) ] = [ ]
}
//add words to the key of their first character
for word in list {
dict[ String( word.characters.prefix(1) ) ]?.append( word )
}
//output dictionary
print(dict)此示例将输出如下字典:
[ "b": ["ba", "bb"],
"a": ["aa", "ab"] ]代码有两个类似的for循环。它们能被合并成一个影响输出的单一循环吗?
发布于 2016-03-22 23:02:32
听起来像是groupBy函数的完美工作:
extension Array {
func groupBy<T: Hashable>(f: Element -> T) -> [T: [Element]] {
var results = [T: [Element]]()
for element in self {
let key = f(element)
if results[key] != nil {
results[key]!.append(element)
} else {
results[key] = [element]
}
}
return results
}
}
var list = ["apple", "apricot", "banana", "blackberry"]
let dict = list.groupBy {
String($0.characters.prefix(1))
}让我们一步一步地走过去:
groupBy接受一个函数,该函数为数组的每个元素提供一个键。它返回一个包含键和具有相同键的元素列表的字典。f是一个提供密钥的函数.对于数组中的每个元素,请检查结果字典是否已经拥有该键。如果是,它将被追加到该键的元素列表中。如果不是,则为该键创建一个新数组。发布于 2016-03-22 23:14:57
//plain array
let list = ["apple", "apricot", "banana", "blackberry"]
//dictionary of arrays
var dict = Dictionary<String, Array<String>>()
//create necessary keys from first characters
for word in list {
if let _ = dict[ String( word.characters.prefix(1) )] {
dict[ String( word.characters.prefix(1) )]?.append(word)
}
else{
dict[ String( word.characters.prefix(1) ) ] = [word]
}
}
//output dictionary
print(dict)https://stackoverflow.com/questions/36166764
复制相似问题