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]

String、Int、Double、および Bool のみが既定でハッシュ可能であるため、Set で同じアプローチを使用することはできません。上記のアプローチを使用できるように範囲をハッシュ可能にする方法は?

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 に答える