【问题标题】:Counting unique items in array. (Swift)计算数组中的唯一项。 (迅速)
【发布时间】:2015-01-09 14:15:20
【问题描述】:

如何计算数组中唯一项的数量?

例子:

let array:Array<Int> = [1,3,2,4,6,1,3,2]

计数功能: array.count 会给8

但我想计算独特的项目,这将给出 5

【问题讨论】:

    标签: arrays swift ios8 xcode6


    【解决方案1】:

    从 Swift 1.2 开始,Swift 有一个原生的 Set 类型。使用Set 构造函数从您的数组中创建一个集合,然后count 属性将告诉您有多少个唯一项:

    let array = [1,3,2,4,6,1,3,2]
    
    let set = Set(array)
    print(set.count)  // prints "5"
    

    对于 Swift 1.1 及更早版本:

    把你的数组变成NSSet

    let array = [1,3,2,4,6,1,3,2]
    
    let set = NSSet(array: array)
    println(set.count)  // prints "5"
    

    您可以阅读更多关于它的信息here


    如果您对每个项目有多少感兴趣,您可以使用字典来计算项目:

    var counts = [Int:Int]()
    
    for item in array {
        counts[item] = (counts[item] ?? 0) + 1
    }
    
    print(counts)        // prints "[6: 1, 2: 2, 3: 2, 1: 2, 4: 1]"
    print(counts.count)  // prints "5"
    print("There are \(counts[1] ?? 0) ones.")    // prints "There are 2 ones."
    print("There are \(counts[7] ?? 0) sevens.")  // prints "There are 0 sevens."
    

    【讨论】:

      【解决方案2】:

      您可以使用NSSet 丢弃重复项:

      let array:Array<Int> = [1,3,2,4,6,1,3,2]
      let count = NSSet(array: array).count
      println(count)
      

      打印出来:

      5

      【讨论】:

        【解决方案3】:

        实现功能 countDistinct(numbers: [Int]) 返回不同元素的数量 数组。 Swift 的 NSSet 文档 https://developer.apple.com/documentation/foundation/nsset

        func countDistinct(numbers: [Int]) -> Int {
            let array:Array<Int> = numbers
            let count = NSSet(array: array).count
            return count
        }
        
        print(countDistinct(numbers: [20, 10, 10, 30, 20]))
        

        【讨论】:

          【解决方案4】:

          如果您更喜欢pure swift,可能的解决方案包括:

          1. 对数组进行排序
          2. 遍历并计算元素与前一个元素不同的次数

          代码翻译:

          let start: (Int, Int?) = (0, nil)
          let count = array.sorted(<).reduce(start) { initial, value in
              (initial.0 + (initial.1 == value ? 0 : 1), value)
          }
          
          let uniqueElements = count.0
          

          结果存储在count元组的元素0中。

          解释:start 元组使用0nil 进行初始化,并作为初始值传递给reduce 方法,该方法在数组的排序副本上调用。 在每次迭代中,都会返回一个新元组,其中包含当前数组元素和当前计数器,如果当前元素与前一个元素不同,则将其加一。

          【讨论】:

            【解决方案5】:

            您还可以使用以下通用方法来计算数组中的唯一值。

            func countUniques<T: Comparable>(_ array: Array<T>) -> Int {
                let sorted = array.sorted()
                let initial: (T?, Int) = (.none, 0)
                let reduced = sorted.reduce(initial) {
                    ($1, $0.0 == $1 ? $0.1 : $0.1 + 1)
                }
                return reduced.1
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-04-16
              • 2021-08-22
              • 2018-04-01
              • 1970-01-01
              • 2023-03-12
              • 2020-05-23
              • 1970-01-01
              • 2016-06-02
              相关资源
              最近更新 更多