2

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

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 是可散列的。如何使范围可散列以能够使用上述方法?

4

2 回答 2

2

对哈希值的唯一要求是

x == y暗示x.hashValue == y.hashValue

这意味着“微不足道”的哈希函数

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)]

您还可以使用从开始到结束索引的距离是整数类型的事实(因此具有哈希值):

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

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

public var hashValue: Int {
    return description.hashValue
}

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

于 2016-03-09T12:53:06.107 回答
1

尝试这个:

extension SequenceType where Generator.Element: Equatable {
    func unique() -> [Generator.Element] {
    var seen: Array<Generator.Element> = []
        return  filter {
        if seen.contains($0){
            return false
        } else {
            seen.append($0)
            return true
        }
    }
    }
}
于 2016-03-09T12:35:43.373 回答