我有一个排序的字符串数组。在这个数组中有没有快速查找和元素的方法?
我想优化以下功能。这花了太长时间。传递的数组不长(只有大约15-20个元素),但它被称为很多(大约1000次)。目前我只是做.filter { }
但我认为这可能是一个瓶颈,因为它去了通过整个阵列1000次而不是在找到第一个这样的日历时爆发。
是否有内置的搜索优化(即,对于非常小的阵列使用不同的方法,然后是中型或更大的阵列),类似于内置的排序功能?
基本上,我正在寻找内置排序/排序功能的对应物。拥有这样的东西会很有意义,因为你经常对数组进行排序,然后在其中找到一个特定的元素。
func startsWithACalendarName(text: String, calendars: [EKCalendar], stripKeywords: Bool = false) -> (newReminderText: String, foundCalendar: EKCalendar?) {
// make array of words from text
let words = text.characters.split{$0 == " "}.map(String.init)
// BOTTLENECK? Check if I have a calendar that is equal to first word of text
let found = calendars.filter { $0.title.lowercaseString == words.head?.lowercaseString }
return (stripKeywords ? (words.tail?.joinWithSeparator(" "))! : text, found.first)
}
答案 0 :(得分:0)
我认为你可以使用' indexOf'来解决这个问题。而不是过滤':
func startsWithACalendarName(text: String, calendars: [EKCalendar], stripKeywords: Bool = false) -> (newReminderText: String, foundCalendar: EKCalendar?) {
let words = text.characters.split{$0 == " "}.map(String.init)
var found: EKCalendar?
if let index = calendars.indexOf ({ $0.title.lowercaseString == words.head?.lowercaseString }) {
found = calendars[index]
}
return (stripKeywords ? (words.tail?.joinWithSeparator(" "))! : text, found)
}