我有一个名为Place
的自定义类,有3个属性:
String
)String
)CLLocationCoordinate2D
)我有一个包含100个对象的[Place]
类型的数组,我想检查GeoPoint
属性上是否有重复项(仅在此属性上)。
如何在自定义对象数组中检查特定属性的重复项?
谢谢!
答案 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
。然后检查是否有不止一次。