如何从具有重复范围的数组中获取具有唯一范围的数组?
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
}
您必须弄清楚哪一个对您的目的最有效。
我可以从具有重复数字的数组中获取一组唯一数字
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
impliesx.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
}
您必须弄清楚哪一个对您的目的最有效。