例如,假设我有一个如下所示的数组:
var someArray = ["1", "1", "2"]
我需要将其分成两个数组,看起来像这样:
["1","1"]
["2"]
我该如何处理?
任何帮助都将不胜感激!
var someArray = ["1", "1", "2"]
我需要将其分成两个数组,看起来像这样:
["1","1"]
["2"]
我该如何处理?
任何帮助都将不胜感激!
使用字典初始化器init(grouping:by:)
然后,通过访问values属性来获取数组。
示例:
let dic = Dictionary(grouping: someArray) { $0 }
let values = Array(dic.values)
print(values)
结果:
[["2"], ["1", "1"]]
以下是一些事实(点赞和回答应该发给 @kirander)
@kirander 的方法使用 Dictionary
将对象映射到 O(N) runtime
和 O(N) memory
中。
其他解决方案大多运行在 O(N*N) runtime
和 O(N) memory
中。因此,对一个随机的包含1000个项目的数组进行分组将需要:@kirander 的解决方案需要0.07秒,而其他解决方案需要34秒。
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)
}
}
})
您可以尝试像这样做:
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)
}
}
let arrM = ["1","3","4","6","1","1","3"]
let arrSrtd = Array(Set(arrM))
for ele in arrSrtd{
let a = arrM.filter( {$0 == ele})
print(a)
}
let someArray: [String] = ["1","3","4","1"]
- farhan