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

时间:2016-03-09 12:15:46

标签: arrays swift set range hashable

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

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可以使用。如何使范围可以使用上述方法?

2 个答案:

答案 0 :(得分: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)]

您也可以使用距离从头到尾的事实 index是一个整数类型(因此有一个哈希值):

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

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

public var hashValue: Int {
    return description.hashValue
}

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

答案 1 :(得分: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
        }
    }
    }
}