arrays - 如何获取 CGPoint 数组的每个值重复的次数

标签 arrays swift sorting filtering

我有一个 CGPoint 数组,

pointArray = [(532.7, 150.0), (66.6, 150.0), (129.2, 150.0), (129.2, 150.0), (301.2, 150.0), (444.2, 150.0), (532.7, 150.0), (532.7, 150.0), (532.7, 150.0)]

如何获取每个点重复的次数?

最佳答案

正如@Alexander 在评论中所说,您应该使用 NSCountedSet,您可以像这样使用它:

let array = [
    CGPoint(x: 532.7, y: 150.0),
    CGPoint(x: 66.6, y: 150.0),
    CGPoint(x: 129.2, y: 150.0),
    CGPoint(x: 129.2, y: 150.0),
    CGPoint(x: 301.2, y: 150.0),
    CGPoint(x: 444.2, y: 150.0),
    CGPoint(x: 532.7, y: 150.0),
    CGPoint(x: 532.7, y: 150.0),
    CGPoint(x: 532.7, y: 150.0)
]

let countedSet = NSCountedSet(array: array)
countedSet.count(for: array.last!) //returns 4

如果您不想使用 NSCountedSet,您可以将字典中的每个点存储为键,将计数存储为值。棘手的是 CGPoint 不符合 Hashable,你可以这样做:

extension CGPoint:Hashable{
    public var hashValue: Int {
        let x = Double(self.x)
        let y = Double(self.y)

        return Int(((x + y)*(x + y + 1)/2) + y)
        //this hash function may not be the best for your data

    }
}

var map = [CGPoint:Int]()
for point in array {
    if let count = map[point] {
        map[point] = count + 1
    } else {
        map[point] = 1
    }
}

map[array.last!]//returns 4

我认为最好使用 NSCountedSet

关于arrays - 如何获取 CGPoint 数组的每个值重复的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41867645/

相关文章:

javascript - 使用嵌套对象对数组内的值进行分组和计数

c - 理解C中的解引用运算符和指针,以及一个小程序的逻辑

ios - 如何切换CAGradientLayer?

java - 对长整型的 JTable 列进行排序

java - 无法将文件从我的计算机本地目录加载到java程序

arrays - 如何从 JSON 数组中提取结果并导入 ColdFusion 以获得 7 天的天气预报

c - 如何找到数组中元素的数量?

不同设备尺寸的 iOS Auto Layout 约束值

ios - 在多行 UIButton 的文本中查找字母的运行时位置

javascript - 以奇怪的方式对数组进行排序