我有一个名为array
的对象数组,其类型为votes
。在数组的对象中有一个名为nameSubject
的字段,它是一个字符串。
如何将我想要与主题名称进行比较的数组和字符串传递给我?这是我的功能:
static func binarySearch(inputArr: [votes], searchItem: String)->Int?{
var lowerIndex = 0;
var upperIndex = inputArr.count - 1
while (true) {
var currentIndex = (lowerIndex + upperIndex)/2
if(inputArr[currentIndex] == searchItem) {
return currentIndex
} else if (lowerIndex > upperIndex) {
return nil
} else {
if (inputArr[currentIndex] > searchItem) {
upperIndex = currentIndex - 1
} else {
lowerIndex = currentIndex + 1
}
}
}
}
错误出现在第一个和第二个if
中,并说明:二进制运算符'=='不能应用于'votes'和'String'类型的操作数“
答案 0 :(得分:1)
以下是我写这个的方法:
// Precondition: the array is sorted by ascending elements
extension Array where Element: Comparable {
func binarySearchForIndex(of desiredElement: Element) -> Int? {
return binarySearchForIndex(of: desiredElement, by: {$0})
}
}
// Precondition: the array is sorted by ascending values of the picker closure.
extension Array {
func binarySearchForIndex<T>(
of desiredElement: T,
by picker: (Element) -> T
) -> Int?
where T: Comparable {
var lowerIndex = 0;
var upperIndex = self.count - 1
while (true) {
let currentIndex = (lowerIndex + upperIndex)/2
let item = picker(self[currentIndex])
if item == desiredElement { return currentIndex }
else if lowerIndex > upperIndex { return nil }
else {
if (item > desiredElement) {
upperIndex = currentIndex - 1
} else {
lowerIndex = currentIndex + 1
}
}
}
}
}
第一个扩展程序允许您直接对任何Array
个Comparable
项进行二进制搜索。
第二个扩展允许您对任何Array
项进行二进制搜索,提供一个闭包,指定要搜索哪个元素的属性。你可以这样做:
let indexOfBobsVote = votes
.sorted{ $0.nameSubject < $0.nameSubject}
.binarySearchForIndex(of: "bob", by: { $0.nameSubject })
答案 1 :(得分:0)
您应该将字符串与对象的nameSubject字符串进行比较,而不是对象本身。
所以你应该做的比较是:
inputArr[currentIndex].nameSubject == searchItem
虽然这对你之后的比较没有帮助。我不确定您要使用&#34;&gt;&#34;
评估您要评估的属性