Поиск в многомерном массиве (Flash As3) с использованием другого массива для критериев поиска - PullRequest
0 голосов
/ 27 сентября 2011

Короче говоря: я хочу найти в многомерном массиве в AS3 (в этом примере) местоположение 6 строк - все из которых хранятся в другом неназванном массиве.

Длинная история:

Как только я получаю местоположения (в многомерном массиве) каждой строки, я узнаю, где она находится, и могу получить доступ к другим атрибутам этого объекта - поэтому, если я обнаружил, строка "box3" находится в элементе [5] моего многомерного массива, теперь я могу нацелиться на:

multiArray [5] [3], чтобы вернуть сохраненный 4-й элемент (имея в виду, что мы начинаем с 0, поэтому 3 - 4-я позиция).

Я могу заставить это работать один раз, но я пытаюсь настроить цикл for на основе длины моего основного массива хранения строк - этот массив содержит (в этом примере) 6 строк имени экземпляра - каждый разМои циклы for, мне нужно запустить поиск в моем многомерном массиве для следующего последовательного имени экземпляра.

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

Единственное, что я могу найти, это сообщение здесь:

http://exoboy.wordpress.com/2010/07/15/successfully-searching-multidimensional-arrays-in-as3/

, которое работаетЗамечательно, если я ищу только один элемент в моем массиве - но как только мне нужно найти несколько элементов в цикле for, используя их код, он распадается.Вы можете увидеть мой вопрос / их ответ на этой странице, а также получить дополнительную информацию.

В конце мне нужна простая для запуска функция, которую можно будет использовать снова и снова, так как я буду делатьмного поиска в этом массиве для моделирования, которое я строю.Спасибо всем, -Эрик

Ответы [ 3 ]

0 голосов
/ 27 сентября 2011

Вот базовая функция, которую вы можете использовать.

Очевидно, вам нужно будет зациклить все массивы, вызывающие эту функцию для теста.

function arrayContains( haystack:Array, needle:String ):Boolean{
  for( var i:Number = 0;i < haystack.length; i++ ) {
    if( needle == haystack[i] ) {
      return true;
    }
  }
  return false;
}


// sample code
var myArray:Array = new Array();
myArray.push(["granola","people... are great"," 4 ","10"]);
myArray.push(["bill","orangutan","buster","keaton"]);
myArray.push(["steve","gates","24","yes, sometimes"]);
myArray.push(["help","dave","jobs","hal"]);

var searchArray:Array = ["granola","orangutan","24","hal"];

for each( var arr:Array in myArray ){
  for each( var searchString:String in searchArray ){
    if( arrayContains( arr, searchString ) ){
      trace( 'found ' + searchString + 'in myArray at ' + myArray.indexOf(arr)  )
    }
  }
}
0 голосов
/ 27 сентября 2011

Эта версия зацикливается с использованием самого метода searchArray () и отслеживает положение в дереве. Как только он находит совпадение, он выводит позицию в searchResults. Затем вы можете использовать getNestedItem () с каждым массивом uints для получения значения.

package  
{
    import flash.utils.getQualifiedClassName;

    public class NestedSearch 
    {
        private var _multidimensionalArray :Array = 
            [
                //[0]
                [
                    // [0]
                    // [0],  [1],    [2]
                    ["one", "two", "three" ], 
                    // [1]
                    // [0],  [1],    [2]
                    ["eleven", "twelve", "thirteen" ] 
                ],
                //[1]
                [
                    // [0]
                    // [0],  [1],    [2]
                    ["hyena", "iguana", "jackal" ], 
                    // [1]
                    "koala"
                ]
            ];

        private var queries :Array = new Array( "three", "twelve", "hyena", "koala" );

        private var searchResults :Array = [];


        public function NestedSearch() 
        {
            // Make multiple queries
            for ( var q in queries)
            {
                searchArray( queries[ q ], _multidimensionalArray, [] );
            }           

            // Use the results
            for ( var i in searchResults )
            {
                trace( 'Found "' + searchResults[ i ].query + 
                      '" at _multidimensionalArray[' + searchResults[ i ].position + ']');  
                trace( "Test value: " + getNestedItem( _multidimensionalArray, searchResults[ i ].position ));
            }
        }

        // Searches any array for an exact String value. 
        // Returns the found string as an Array of uints representing its position in the tree.
        public function searchArray ( s:String, a:Array, positionPath:Array )
        {
            // Duplicate array to save it before going back out
            var _origPosPath = positionPath.concat();   

            for ( var i in a )
            {
                if ( getQualifiedClassName( a[ i ] ) === "Array")
                {
                    positionPath.push(i);
                    searchArray( s, a[ i ], positionPath );
                    positionPath = _origPosPath;
                }
                else
                {
                    if ( a[ i ] === s)
                        searchResults.push( {query: s, position: positionPath.concat( i )} );
                }
            }
        }

        private function getNestedItem ( arr:Array, pos:Array ) :*
        {
            var nestedItem;
            var p = pos.shift();
            if ( pos.length === 0 )
            {
                nestedItem = arr[ p ];
            }
            else 
            {
                nestedItem = getNestedItem( arr[ p ], pos );
            }
            return nestedItem;      
        }

    }
}
0 голосов
/ 27 сентября 2011

Полагаю, вам нужно два цикла for.

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

имеет смысл?

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