【问题标题】:Swift 2 count duplicate in arraySwift 2在数组中计数重复
【发布时间】:2016-03-05 23:07:54
【问题描述】:

您能帮我简化下面的流程吗? 范围是计算每个元素在给定数组中重复的次数。

var test = [1,2,3,4,5,6,7,8,5,9,3,3,9,9,9]

var testCount = [Int:Int]()

for curr in test {
    if let x = testCount[curr] {
        testCount[curr] = x  + 1
        continue;
    }
    testCount[curr] = 1
}

print(testCount)

我正在研究它,以便获得类似的东西:

test.map_duplicate() or map_duplicate(test)

【问题讨论】:

    标签: arrays swift count duplicates


    【解决方案1】:
    extension Array where Element: Hashable {
    
        func mergeDuplicates() -> [Element: Int] {
            var result = [Element: Int]()
    
            self.forEach({ result[$0] = result[$0] ?? 0 + 1 })
    
            return result
        }
    
    }
    
    var test = [1,2,3,4,5,6,7,8,5,9,3,3,9,9,9]
    
    let testCount = test.mergeDuplicates()
    
    print(testCount)
    

    上面的代码提供了对任何包含Hashable 元素的Array 类型的扩展(其他任何东西都不能成为字典的键)。方法mergeDuplicates 生成您想要的字典。在其实现中,forEach() 对数组中的每个元素执行一个闭包(这通常是老式 for 循环的更直接和透明的替代方案)。然后在每次迭代中,我们检查字典中是否已经存在具有运行计数的值(并使用 nil-coalescing 运算符?? 来处理之前尚未满足特定值的情况,因此它为零)。然后递增,并存储(返回)到字典中。

    【讨论】:

    • 谢谢!虽然是一个小错误。 self.forEach{ 结果[$0] = (result[$0] ?? 0) + 1 }
    【解决方案2】:

    您可以扩展 SequenceType 以拥有一个函数 freq,它完全符合您的需要。

    extension SequenceType where Self.Generator.Element: Hashable {
        func freq() -> [Self.Generator.Element: Int] {
            return reduce([:]) { (var accu: [Self.Generator.Element: Int], element) in
                accu[element] = accu[element]?.successor() ?? 1
                return accu
            }
        }
    }
    

    【讨论】:

      【解决方案3】:
      var countForNumber = 0
      
      for number in test {
          test.forEach({ if number == $0 { countForNumber++ } })
          testCount[number] = countForNumber
          countForNumber = 0
      }
      

      【讨论】:

        猜你喜欢
        • 2015-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-22
        • 1970-01-01
        相关资源
        最近更新 更多