AS3: большие текстовые файлы с indexOf () в массиве - PullRequest
0 голосов
/ 12 ноября 2011

Я встраиваю словарь 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 голосов
/ 12 ноября 2011

По моему опыту (у меня нет прямой документации для резервного копирования), 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, это, безусловно, лучшее решение (не нужно загружать и анализировать файл). Также важно отметить, что если ваш словарь действительно очень большой, компилятор флэш-памяти в конечном итоге взорвется от стыда.

РЕДАКТИРОВАТЬ:

Я превратил SOWPODS, которые я нашел здесь http://www.isc.ro/en/commands/lists.html в рабочий класс, получите его здесь: http://www.4shared.com/file/yQl659Bq/DictSOWPODS.html?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...