AS3 - 使用字符串快速搜索数组

时间:2014-09-30 09:54:36

标签: arrays performance actionscript-3 search

我需要帮助。我正在制作类似字典(但你自己填写)。我需要快速搜索其中的单词。我需要使用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!"}));
}

1 个答案:

答案 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);
        }
    }
}