我需要帮助。我正在制作类似字典(但你自己填写)。我需要快速搜索其中的单词。我需要使用Object或Array(因为JSON不支持Dictionary。有保存文件的选项)。我有这个代码,但我担心当数组中会有很多单词时,搜索速度并不快。请帮忙。
public function Search (string:String,section:String = Wordbook.NEWW):int
{
var str:String = string.toUpperCase();
for (i = 0; i < NewWords.length; i++)
{
if (NewWords[i].toUpperCase.indexOf(str) > -1)
{
return i;
}
}
return -1;//If not found
}
示例如何工作:( SearchTxt - 文本字段,用户应在此处键入他需要查找的单词; WB - Wordbook类; WB.NewWords&amp; WB.NewWordsT - 此类中的数组)
var index:int = WB.Search(SearchTxt.text,Wordbook.NEWW);
if(index>-1){
WordTxt.text = WB.NewWords[index];
TranslationTxt.text = WB.NewWordsT[index];
} else {
dispatchEvent(new EventWithMessage(EventWithMessage.ERROR,{error:"No match!"}));
}
答案 0 :(得分:0)
这里有两种解决方案,具体取决于您的使用情况。
解决方案1:不管它!
如果您要构建的最大词典只有一百字左右,那么线性搜索的效果会很好。
解决方案2:实施二进制搜索算法
如果您确实需要处理数千个单词的大型词典,二进制搜索算法将提供更高的性能。为此,您需要保证搜索数组已排序。
这样的事情可以解决问题:
public function Search (string:String,section:Array = NewWords, offset:int = 0):int
{
if (section.length == 0) {
return -1;
}
var str:String = string.toUpperCase();
var firstCharCode:int = str.charCodeAt(0);
var middleWord:String = section[section.length / 2];
var middleWordCharCode:int = middleWord.charCodeAt(0);
if (middleWord.substr(0,str.length) == str) {
return (section.length / 2) + offset;
} else {
var comparison:int = str.localeCompare(middleWord);
if (comparison < 0) {
return Search(string, section.splice(0, section.length / 2), offset);
} else { // then comparison > 0
var newOffset:int = offset + section.length / 2;
return Search(string, section.splice(section.length / 2, section.length-1), newOffset);
}
}
}