【发布时间】:2015-03-16 00:17:44
【问题描述】:
尝试扩展 Array 类型以使用二进制排序来按顺序插入元素。 这是我的游乐场代码:
extension Array {
func insertionIndexOf(elem: T , isOrderedBefore: (T, T) -> Bool) -> Int {
var lo = 0
var hi = self.count - 1
while lo <= hi {
let mid = (lo + hi)/2
if isOrderedBefore(self[mid], elem) {
lo = mid + 1
} else if isOrderedBefore(elem, self[mid]) {
hi = mid - 1
} else {
return mid
}
}
return 0
}
mutating func insertOrdered(elem: T){
let index = self.insertionIndexOf(elem, isOrderedBefore: { (a , b) in return (a > b) } )
return insert(elem, atIndex: index)
}
}
我得到一个编译器错误:“不能调用带有类型参数列表的insertionIndexOf (T, isOrderedBefore: (_, _) -> _)”
奇怪的是,如果我改用:
mutating func insertOrdered(elem: T){
let index = self.insertionIndexOf(elem, isOrderedBefore: { (a , b) in return false } )
return insert(elem, atIndex: index)
}
编译器平静下来,但数组插入不会被排序,:(当然。 请问有什么想法吗??谢谢。
(使用 Xcode 6.3 beta 2 - Swift 1.2)
【问题讨论】:
-
那段代码看起来很眼熟stackoverflow.com/a/26679191/1187415 :) – 注意最后的
return 0应该是return lo。 -
@MartinR 是的 :) 我使用您的示例进行二分搜索,以便为我的问题添加上下文。我一直在玩扩展名。抱歉,刚刚忘记添加指向您的代码的链接。希望没有伤害。
标签: arrays swift swift-playground