AS3:数组上带有indexOf()的大型文本文件

时间:2011-11-11 20:28:02

标签: actionscript-3

我将sowpods字典嵌入到AS3中的数组中,然后使用indexOf()提交搜索以验证该单词的存在。

当我加载较小的文本文件时,它似乎工作但不是更大。由于文件是在编译期间嵌入的,因此不应该有加载事件来收听吗?

代码:

package {
    import flash.display.MovieClip;

    public class DictionaryCheck extends MovieClip {

        [Embed(source="test.txt",mimeType="application/octet-stream")] // Works fine 10 rows.
                //[Embed(source="sowpods.txt",mimeType="application/octet-stream")] //Won't work too large.
        private static const DictionaryFile:Class;

        private static var words:Array = new DictionaryFile().toString().split("\n");

        public function DictionaryCheck() {
            containsWord("AARDVARKS");
        }

        public static function containsWord(word:String):* {
            trace(words[10]); //Traces "AARDVARKS" in both versions of file
            trace((words[10]) == word); // Traces true in shorter text file false in longer
            trace("Returning: " + (words.indexOf(word))); // traces Returning: 10 in smaller file
            if((words.indexOf(word)) > -1){
               trace("Yes!"); // traces "Yes" in shorter file not in longer
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

根据我的经验(我没有直接的文档来支持我),Flash无法打开非常大的文本文件。我之前导入字典时遇到了同样的问题。

我最终做的是将字典转换为ActionScript类,这样我就不必加载文件并将其解析为字典以便更好地搜索,字典已经被解析并存储在阵列。由于数组成员已经排序,我使用简单的半间隔搜索函数(http://en.wikipedia.org/wiki/Binary_search_algorithm)来确定字典是否包含该单词。

基本上,你的字典看起来像这样:

public class DictSOWPODS {
    protected var parsedDictionary : Array = ["firstword", "secondword", ..., "lastword"]; // yes, this will be the hugest array initialization you've ever seen, just make sure it's sorted so you can search it fast

    public function containsWord(word : String) : Boolean {
        var result : Boolean = false;
        // perform the actual half-interval search here (please do not keep it this way)
        var indexFound : int = parsedDictionary.indexOf(word);
        result = (indexFound >= 0)
        // end of perform the actual half-interval search (please do not keep it this way)
        return result;
    }
}

使用AS类而不是文本文件,唯一丢失的是您无法在运行时更改它(除非您使用swc来保存类),但是因为您已经在文本文件中嵌入了文本文件。 swf,这应该是迄今为止最好的解决方案(无需加载和解析文件)。 同样重要的是要注意,如果你的字典真的很大,那么flash编译器最终会羞愧地爆炸。

修改

我已将我在http://www.isc.ro/en/commands/lists.html找到的SOWPODS转换为工人阶级,请点击此处: http://www.4shared.com/file/yQl659Bq/DictSOWPODS.html