项目需要添加一个关键字过滤的功能,基本思路如下:
1.从服务器获取关键字数据,根据首字母保存到关键字字典中
(key->关键字首字母,value->相同首字母的关键字的数组)
2.获取用户输入字符串,从左侧截取字符,取得字符首字母,
并在关键字字典中匹配对应的数组
3.从右侧截取字符,于2中取得的数组进行折半查询
4.如查询到关键字,替换关键字为等长*
但实际应用中对于过长的字符串效率太低
想问问大家有没有什么好的方法
正则表达式是现在已知的比较好的方法,可是实在是写不出来。。。
我感覺你描述的是不完整的字典樹。資料組織的結構:
以及這一步驟:
讓我覺得比較奇怪,不明白為什麼要這樣。
我覺得有兩種做法可以改進:
第一種做法:字典樹
要在原有的基礎上改進,可以實作字典樹。從伺服器取到的關鍵字數據,根據首字母分成各個分支,每個分支根據第二個字母再分成各個分支,每個分支根據第三個字母再分成各個分支……
也就把你描述的資料結構改成了
查詢的時候先按第一個字母查,進入某個分支,然後按第二個字母進入某個分支,然後第三個字母… 直到查到/查不到為止。
這樣建立樹需要一些時間,但是查詢是非常快的。最長的字串有多少個字母,就最多需要多少次查詢,也就是查詢的速度與關鍵字的個數沒關係了。
第二種做法:Hash
我覺得上面的做法還是挺麻煩的,為何不 Hash 一下呢?把伺服器取到的每個關鍵字(完整的,不分字母了)保存在 Hash 數組裡(在 iOS 裡的
NSDictionary
裡即可),然後把用戶輸入直接查一下就行了唄?這樣不是最方便、最快的嗎?