swift 如何将数组中匹配的项分组到另一个数组中?

bvn4nwqk  于 2023-05-05  发布在  Swift
关注(0)|答案(3)|浏览(184)

例如,假设我有一个像这样的数组:
var someArray = ["1", "1", "2"]
我需要把它放到两个数组中,看起来像这样:
["1","1"]
["2"]
我该怎么办?
任何帮助将是伟大的!

kqqjbcuj

kqqjbcuj1#

使用字典初始化器**init(grouping:by:)**然后通过访问 values 属性来获取数组。
示例:

let dic = Dictionary(grouping: someArray) { $0 }
let values = Array(dic.values)
print(values)

结果:

[["2"], ["1", "1"]]
kq0g1dla

kq0g1dla2#

以下是一些事实(赞成票和答案应该去@kirander)
使用@kirander方法的是使用Dictionary来MapO(N) runtimeO(N) memory中的对象。
其他解决方案主要运行在O(N*N) runtimeO(N) memory上。因此,对1000个项目的随机数组进行分组需要:0.07s使用@kirander解决方案,34 s。其他解决方案。

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)
    }
  }
})
hmae6n7t

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)
    }
}

相关问题