Comunidad de diseño web y desarrollo en internet online

Buscar en una Array Multidimensional.

Citar            
MensajeEscrito el 18 Ene 2010 10:22 am
Hola,

Tengo un problemilla, tengo una Array multidimensional y me gustaría buscar un texto dentro de ella y me dijera si existe en algún nivel.

He probado de hacer esto:

Aqui tengo la array y llamo a la clase que he creado.

Código ActionScript :

public var laArray:Array = ["uno","dos","tres",["cuatro","cinco"],"seis","siete",["ocho",["nueve","diez"]]]
var buscar:Buscar = new Buscar();
trace(buscar.textoEnArray(laArray,"cinco"))


Esta es la clase:

Código ActionScript :

package com.mu.utils{
   public class Buscar{
      public function textoEnArray(array:Array,texto:String):Boolean{
         for(var a:int = 0; a < array.length; a++){
            if(array[a] == texto){
               return true;
            }else if(a == array.length-1){
               for(var b:int = 0; b < array.length; b++){
                  if(array[b] as String == null && array[b].length > 0){
                     textoEnArray(array[b],texto);
                     break;
                  }
               }
            }
         }
         return false;
      }
   }
}


Si busco cinco, lo encuentra pero cuando hace "return true", igualmente me devuelve false.
Si busco algo en el primer nivel, funciona correctamente. Y si busco nueve que está al final, nunca llega porque tiene que volver al nivel anterior cuando ha buscado dentro de "cuatro y cinco".

¿Conoceis alguna manera sencilla? he buscado en internet pero no he encontrado nada.

Gracias de antemano!.
Manu

Por sayid00

22 de clabLevel



 

Barcelona

firefox
Citar            
MensajeEscrito el 18 Ene 2010 07:58 pm
asi de rapido es mas facil detectar si alguno de los item del Array es "Array" con el uso del operador "is" se puede detectar esto por ejemplo :

Código ActionScript :

var multiArray:Array = new Array("uno","dos","tres",
                         ["cuatro","cinco"],
                         "seis","siete","ocho",
                         ["nueve","dies"]
                         );

function search(pArray:Array, pWord:String):void
{
   for (var i:uint=0; i<pArray.length; ++i)
   {
      if (pArray[i] == pWord)
      {
         trace("word:",pWord,"nivel=",i);
      } 
      if (pArray[i] is Array)
      {
         for (var j:uint=0; j<pArray[i].length; ++j)
         {
            if(pArray[i][j] == pWord) 
            {
               trace("word:",pWord,"nivel=",i,"subnivel=",j);
            }
         }
      }
   }

}
//test 
search(multiArray,"seis");
search(multiArray,"nueve");


Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 18 Ene 2010 08:23 pm
Gracias! Pero para hacerla recursiva, es decir sin definir los niveles, que siga buscando hasta que no quede ningún nivel por mirar. En el mio devuelve false no se porque, porque hize un debug y llegaba al return true... pero seguia hasta el return false.

Saludos y gracias!
manu.

Por sayid00

22 de clabLevel



 

Barcelona

firefox
Citar            
MensajeEscrito el 18 Ene 2010 08:43 pm
intenta volver a llamar a la funcion en esta linea :

Código ActionScript :

if (pArray[i] is Array) 
{ 
         var tmp:Array = pArray[i];
     search(tmp,pWord);
} 


no lo he probado, pero segun yo le pasara el array encontrado de nuevo a la funcion y con el primer condicional buscaria la palabra y si aun dentro de ese array hay un array, se realizaria el ciclo .

Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 18 Ene 2010 08:53 pm
Gracias por la ayuda!

He ajustado lo que me dices pero no funciona:

Código ActionScript :

public function enArrayTexto(array:Array,texto:String):Boolean{
         for(var a:int = 0; a < array.length; a++){
            if(String(array[a]) == texto){
               trace("ENCONTRADO");
               return true;
               break;
            }else if(a == array.length-1){
               for(var b:int = 0; b < array.length; b++){
                  if(array[b] is Array){
                     var tmp:Array = array[b];
                     enArrayTexto(tmp,texto);
                  }
               }
            }
         }
         trace("LLEGA A FALSE");
         return false;
      }


Este es el trace:

Código :

ENCONTRADO
LLEGA A FALSE
false


Gracias!

Por sayid00

22 de clabLevel



 

Barcelona

firefox
Citar            
MensajeEscrito el 19 Ene 2010 12:29 am
lo que pasa es que no se esta saliendo del primer condicional , para comprobar utiliza trace(array); al principio del loop for, para que compruebes como cambia el array en la recursion y apesar de que ya lo encontro, vuelve a pasarle otra vez el array.

Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 19 Ene 2010 07:23 am
Sayd, si casi lo tenías. Cuando pones

Código ActionScript :

if(array[b] as String == null && array[b].length > 0){ 
                     textoEnArray(array[b],texto); 
                     break; 
                  }

debería ser

Código ActionScript :

if(array[b] as String == null && array[b].length > 0){ 
        if (textoEnArray(array[b],texto)){
                   return true; 
        }
        break

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Ene 2010 09:53 am
Cierto! y muchas gracias!!!

Lo único que quitado es el break, ya que si se pone, no sigue mirando si hay mas Arrays después.

Código ActionScript :

public function textoEnArray(array:Array,texto:String):Boolean{
   for(var a:int = 0; a < array.length; a++){
      if(array[a] == texto){
         return true;
      }else if(a == array.length-1){
         for(var b:int = 0; b < array.length; b++){
            if(array[b] is Array){
               if(textoEnArray(array[b],texto)){
                  return true;
               }
            }
         }
      }
   }
   return false;
}


Ahora lo que averiguare es que me devuelva los niveles exactos.

Saludos y gracias!!
manu.

Por sayid00

22 de clabLevel



 

Barcelona

firefox
Citar            
MensajeEscrito el 19 Ene 2010 08:43 pm
Hola,
la verdad es que la pregunta me parece muy interesante, y aquí os dejo lo que se me ha ocurrido:

Código ActionScript :

var multiArray:Array = new Array("uno",
                         "dos",
                         "tres",
                         ["cuatro", "cinco"],
                         "seis",
                         "siete",
                         "ocho",
                         ["nueve", ["once", "doce"]]);

function search(pArray:Array, pWord:String):Array
{
   var index:Array = [];
   for (var i:uint = 0; i < pArray.length; ++i)
   {
      if (pArray[i] == pWord) index.push(i);
      if (pArray[i] is Array)
      {
         var aux:Array = search(pArray[i], pWord);
         if (aux.length > 0) index.push(i, aux);
      }
   }
   return index;
}

trace(search(multiArray, "seis")); // 4
trace(search(multiArray, "nueve")); // 7,0
trace(search(multiArray, "doce")); // 7,1,1

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 19 Ene 2010 11:29 pm
creo que este post servira de mucho ... muy buenos codigos :)

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

msie8
Citar            
MensajeEscrito el 20 Ene 2010 09:02 am
muy bueno isidoro, parece que funciona a la perfección. Si que servirá mucho! :)

Por sayid00

22 de clabLevel



 

Barcelona

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.