【问题标题】:How to remove duplicate items from an array with multiple criteria?如何从具有多个条件的数组中删除重复项?
【发布时间】:2019-10-12 19:43:33
【问题描述】:

目标:我必须从具有相同标题、附近、坐标.纬度和坐标.经度的数组中删除对象

    class Place {
        var placeID: String?
        var title: String?
        var vicinity: String?
        var detailsUrl: String?
        var openingHours: OpeningHours?
        var position: [Double]

        var coordinate: CLLocationCoordinate2D {
          return CLLocationCoordinate2DMake(position.first ?? 0, position.last ?? 0)
    }

我尝试过的一种方法-

extension Array {
    func removingDuplicates <T: Hashable>(byKey key: (Element) -> T) -> [Element] {
        var result = [Element]()
        var seen = Set<T>()
        for value in self {
            if seen.insert(key(value)).inserted {
                result.append(value)
            }
        }
        return result
    }
}


let array = list.removingDuplicates(byKey: { "\($0.coordinate.latitude)" + "\($0.coordinate.longitude)" + ($0.title ?? " ") + ($0.vicinity ?? " ") })

但我真的不喜欢上述解决方案。最合适的处理方式是什么?

【问题讨论】:

  • 如果可能的话,我会检查该项目是否存在之前插入它。或者无论如何都要使用一套。并添加Equatable的自定义实现
  • 具有相同标题/附近/坐标的地点是否一般被视为平等,还是仅在此特定情况下?

标签: ios arrays swift sorting hash


【解决方案1】:

Equatable 添加到Place

class Place: Equatable {
    static func == (lhs: Place, rhs: Place) -> Bool {
        return lhs.title == rhs.title && lhs.vicinity == rhs.vicinity &&
            lhs.coordinate.latitude == rhs.coordinate.latitude && lhs.coordinate.longitude == rhs.coordinate.longitude
    }
    //...        
}

并使用要删除的地方/地方过滤数组元素

var list = [Place]()
//Delete multiple places
let placesToDelete = [Place]()
let result = list.removeAll { placesToDelete.contains($0) }
//Delete one place
let placeToDelete = Place()
let result = list.removeAll { $0 == placeToDelete }

【讨论】:

    猜你喜欢
    • 2020-02-18
    • 2020-10-19
    • 2020-07-25
    • 2017-01-07
    • 2021-01-23
    • 2016-08-05
    • 1970-01-01
    • 2018-09-15
    • 2021-08-15
    相关资源
    最近更新 更多