AS3 - Поиск в массиве элементов, содержащих определенное слово, когда каждый элемент имеет длину абзаца - PullRequest
1 голос
/ 29 марта 2010

немного нового для AS3, так что простите, если это немного простой вопрос.

Я создал массив, и каждый элемент в массиве представляет собой описание чего-либо, длиной около 20 слов, я хочу найти массив и вернуть каждый элемент, содержащий определенное слово.

Все остальные учебники, которые я нашел, основаны на циклическом поиске точного соответствия.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 29 марта 2010

Неважно, что, вам нужно будет пройтись по массиву, чтобы найти совпадение.

При этом используйте метод String.search() для поиска своего слова:

var searchTerm:String = "whatever word you're looking for";
var foundItems:Array = new Array();

for each(var paragraph:String in paragraphArray) {
    if(paragraph.search(searchTerm) != -1) {
        foundItems.push(paragraph);
    }
}
return foundItems;

EDIT : Я протестировал следующий код, и он, кажется, работает нормально.

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="filterArray()">
    <mx:Script>
        <![CDATA[
            private var arr:Array = ["a", "a b c", "c d e", "a d e", "z q aaa r"];
            private var searchF:String = "a";

            private function filterArray():void {
                var searchTerm:String = searchF;

                for each(var paragraph:String in arr) {
                    if(paragraph.search(searchTerm) != -1) {
                        trace('found: ' + paragraph);
                    }
                }
            }
        ]]>
    </mx:Script>
</mx:Application>

Редактировать # 2 : я изменил предыдущий фрагмент кода, чтобы он выглядел больше как то, что вы имели в своем комментарии. Я выбрал "searchF" и указал на него из searchTerm в filterArray().

1 голос
/ 29 марта 2010

Единственный эффективный способ сделать то, что вам нужно, это справочная таблица (они могут стать сложными, прежде чем приступить к этому, проведите несколько тестов производительности - перечисленные здесь подходы поиска методом грубой силы могут подойти вам).

Основная идея заключается в том, что вы ведете список всех абзацев, где встречалось определенное слово. Итак, если «foobar» появился в пунктах 1, 2 и 7, мы бы хотели, чтобы следующее было верно:

myLookupTable["foobar"] = [1,2,7];

Если мы сделаем это для каждого слова в каждом параграфе, мы получим небольшой список.

Это основная идея:

var myHugeArray:Array = // fill your array data in here

var lookup:Object = {};

// Now we iterate through each item in your array and index all the words that we find
for (var idx:int in myHugeArray)
{
    var par:String = myHugeArray[idx] as String;
    par = par.replace(/['",.;:-()!?]/g, " "); // remove common punctuation

    var words:Array = par.split(" ");  // split the paragraph into specific words
    for each(var word:String in words) 
    {
        if(lookup[word] == undefined}
            lookup[word] = [];
        lookup[word].push(idx); // record the index of the paragraph that contained the word
    }
}

// now do search for a word
var results:Array = lookup["foobar"];
if(results != null)
{
    for each(var idx:int in results)
        trace("Hit!", myHugeArray[idx]);
}

Теперь вам нужно обновлять таблицу поиска всякий раз, когда вы добавляете или удаляете элементы из массива (здесь не показано). Кроме того, вы можете создать «список остановок» из распространенных слов, таких как «the» и «a», которые не индексируются. Наконец, это только вернет точные совпадения для слов. Если вы хотите иметь возможность набирать «foob» и получать хиты для «foobar», вам нужно создать внутрисловные индексы, которые намного сложнее и требуют больше памяти.

0 голосов
/ 29 марта 2010

filter

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/Array.html#filter%28%29

var myArray = ['aaa', 'bbb', 'cac'];
var needle = 'a';
trace( myArray.filter(array_search) );


function array_search(element:*, index:int, arr:Array):Boolean {
    return (element.indexOf(needle) > -1 ? true : false);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...