检查Swift数组上的重复属性

时间:2016-11-17 07:54:13

标签: ios iphone arrays swift cocoa-touch

我有一个名为Place的自定义类,有3个属性:

  • 姓名(String
  • 类别(String
  • GeoPoint(CLLocationCoordinate2D

我有一个包含100个对象的[Place]类型的数组,我想检查GeoPoint属性上是否有重复项(仅在此属性上)。

如何在自定义对象数组中检查特定属性的重复项?

谢谢!

2 个答案:

答案 0 :(得分:2)

虽然接受的答案是好的,但我还想填写。

还有两种方法可以实现您的目标,并且它们都受益于SDK提供的功能。

1 - 使用Set作为评论中提到的Tj3n。 要实现此目的,您需要使Place符合Hashable协议。

class Place : Hashable {
    var name = ""
    var category = ""
    var geoPoint: CLLocationCoordinate2D = CLLocationCoordinate2D()

    var hashValue: Int {
        get {
            return geoPoint.longitude.hashValue &+ geoPoint.latitude.hashValue
        }
    }
}

func ==(lhs: Place, rhs: Place) -> Bool {
    return lhs.geoPoint.latitude == rhs.geoPoint.latitude && lhs.geoPoint.longitude == rhs.geoPoint.longitude
}

&+中的hashValue运算符意味着"添加,并且不会在溢出时崩溃"。使用它尽可能简单明了 - let set = Set(yourArrayOfPlaces) - set只包含与geoPoint相关的唯一地点。

2 - 使用KVC。虽然这更像是一个Objective-C世界,但我发现它是一个有用的工具。为此,您需要Place继承NSObject。然后获得一系列独特的地方可以简化为这一行:

let uniquePlaces = (yourPlacesArray as NSArray).value(forKeyPath: "@distinctUnionOfObjects.geoPoint")

答案 1 :(得分:1)

您可以这样做:

var dict : [String : Int] = [:]

for place in arr {
    if dict[place.GeoPoint] != nil {  // Not in dictionary
        if dict[place.GeoPoint] >= 1 { // If already there
            return true // Duplicate
        } else {
            dict[place.GeoPoint]! += 1 // Increment instance
        }
    } else {
        dict[place.GeoPoint] = 0 // Put in dictionary
    }
}

return false // No duplicates

您在[Place]数组中循环,并检查有多少具有相同的GeoPoint。然后检查是否有不止一次。