例如,假设我有一个像这样的数组:var someArray = ["1", "1", "2"]我需要把它放到两个数组中,看起来像这样:["1","1"]["2"]我该怎么办?任何帮助将是伟大的!
var someArray = ["1", "1", "2"]
["1","1"]
["2"]
kqqjbcuj1#
使用字典初始化器**init(grouping:by:)**然后通过访问 values 属性来获取数组。示例:
let dic = Dictionary(grouping: someArray) { $0 } let values = Array(dic.values) print(values)
结果:
[["2"], ["1", "1"]]
kq0g1dla2#
以下是一些事实(赞成票和答案应该去@kirander)使用@kirander方法的是使用Dictionary来MapO(N) runtime和O(N) memory中的对象。其他解决方案主要运行在O(N*N) runtime和O(N) memory上。因此,对1000个项目的随机数组进行分组需要:0.07s使用@kirander解决方案,34 s。其他解决方案。
Dictionary
O(N) runtime
O(N) memory
O(N*N) runtime
func benchmark(_ title:String, code: ()->()) { let startTime = CFAbsoluteTimeGetCurrent() code() let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime print("Time elapsed for \(title): \(timeElapsed) s.") } var array:[String] = [] for _ in 0...1000 { array.append("\(Int(arc4random_uniform(10)))") } // @kirander solution 0.07s benchmark("Dictionary", code: { let dic = Dictionary(grouping: array, by: { $0 }) let values = Array(dic.values) }) // @Bruno solution ~34s benchmark("Array", code: { var resultingArrays = [[String]]() for value in array { let ar = array.filter({ $0 == value }) if !resultingArrays.contains(where: {$0 == ar}) { resultingArrays.append(ar) } } })
hmae6n7t3#
你可以尝试这样的东西:
var someArray = ["1", "1", "2"] var resultingArrays = [[String]]() for value in someArray { let array = someArray.filter({ $0 == value }) if !resultingArrays.contains(where: {$0 == array}) { resultingArrays.append(array) } }
3条答案
按热度按时间kqqjbcuj1#
使用字典初始化器**init(grouping:by:)**然后通过访问 values 属性来获取数组。
示例:
结果:
kq0g1dla2#
以下是一些事实(赞成票和答案应该去@kirander)
使用@kirander方法的是使用
Dictionary
来MapO(N) runtime
和O(N) memory
中的对象。其他解决方案主要运行在
O(N*N) runtime
和O(N) memory
上。因此,对1000个项目的随机数组进行分组需要:0.07s使用@kirander解决方案,34 s。其他解决方案。hmae6n7t3#
你可以尝试这样的东西: