如何从具有重复范围的数组中获取具有唯一范围的数组?

How to get an array having unique ranges from the array with duplicated ranges?

我可以从具有重复数字的数组中获取一组唯一数字

let arrayWithReapeats = [1, 2, 3, 7, 3]
let unique = Array(Set(arrayWithReapeats))

我需要一个具有唯一范围的数组

Range<String.Index>

来自具有重复范围的数组,例如像这样。

let arrayWithReapeatsIdexes = [1..<5, 3..<9, 9..<25, 3..<9]

我不能对 Set 使用相同的方法,因为默认情况下只有 String、Int、Double 和 Bool 是可哈希的。如何使范围可散列以便能够使用上述方法?

试试这个:

extension SequenceType where Generator.Element: Equatable {
    func unique() -> [Generator.Element] {
    var seen: Array<Generator.Element> = []
        return  filter {
        if seen.contains([=10=]){
            return false
        } else {
            seen.append([=10=])
            return true
        }
    }
    }
}

要求哈希值是

x == y implies x.hashValue == y.hashValue

这意味着"trivial"散列函数

extension Range : Hashable {
    public var hashValue: Int {
        return 0
    }
}

有效且有效:

let arrayWithRepeatingIndexes = [1..<5, 3..<9, 9..<25, 3..<9]
let arrayWithUniqueIndexes = Array(Set(arrayWithRepeatingIndexes))

print(arrayWithUniqueIndexes)
// [Range(1..<5), Range(3..<9), Range(9..<25)]

你也可以利用从头到尾的距离 index 是一个整数类型(因此有一个散列值):

public var hashValue: Int {
    return startIndex.distanceTo(endIndex).hashValue
}

或根据描述字符串(例如“3..<9”)计算哈希值:

public var hashValue: Int {
    return description.hashValue
}

您必须弄清楚哪一个对您的目的最有效。