Comunidad de diseño web y desarrollo en internet online

Comparar dos array

Citar            
MensajeEscrito el 25 Jun 2007 08:57 pm
Hola:

Estoy realizando un juego de organización de elementos en columnas.

Tengo dos columnas con diferentes nombres a las que hay que arrastrar elementos de manera adecuada para que correspondan con la columna.

Para hacer la validación tengo dos array que contienen las respuetas correctas, además de otros dos array en los que se van añadiendo los elementos de manera dinámica conforme se van arrastrando a la columna.

Todo bien hasta el momento de hacer la validación y comparación de los cuatro array, ya que no puedo obtener los resultados equivocados, sólo los buenos.

Aquí el código:

Código :

var arrayColQuimica:Array = new Array("pap_cara", "pap_mas_blanca", "pap_mas_blancos", "pap_menos_cuerpo", "pap_quita_lignina");
var arrayColMecanica:Array = new Array("pap_amarillentos", "pap_barata", "pap_mas_cuerpo", "pap_menos_blanca", "pap_no_quita_lignina", "pap_opacos");
var correctasEjer:Array = arrayColQuimica.concat(arrayColMecanica);
trace (correctasEjer);
var arrayColQuimicaResp:Array = new Array();
var arrayColMecanicaResp:Array = new Array();
var respondidasEjer:Array = new Array(arrayColQuimicaResp, arrayColMecanicaResp);
arrayColQuimicaResp.concat(arrayColMecanicaResp);
function colocaTextos(movieClip){
    with (ejercicio) {
        columnas = [(cel_mecanica), (cel_quimica)];
        colMecanica = columnas[0];
        colQuimica = columnas[1];
        movieClipString = String(movieClip).substr(18);
        var arrayTemporal1:Array = _root.arrayColMecanicaResp.slice();
        var arrayTemporal2:Array = _root.arrayColQuimicaResp.slice();
        j=0;
        while(movieClipString != arrayTemporal1[j] and j < arrayTemporal1.length){
            j++;
        }
        k=0;
        while(movieClipString != arrayTemporal2[k] and k < arrayTemporal2.length){
            k++;
        }
        Array.prototype.removeItem=function(find){
        for(var z=0;z<this.length;++z){
            if(this[z] == find){
                this.splice(z,1)
            }
        }
        return false
        }
        for(i=0;i<columnas.length;i++){
            if (eval(movieClip._droptarget) == columnas[i]) {
                movieClip._x = columnas[i]._x + ((columnas[i]._width - movieClip._width)/2);
                trace ("donde se soltó el MC "+eval(movieClip._droptarget));
                trace ("nombre del MC soltado "+movieClip);
                if (eval(movieClip._droptarget) == colMecanica) {
                    trace ("valor inicial del array colMecanica: "+_root.arrayColMecanicaResp);
                    trace ("valor actual del array colMecanicaTemporal: "+arrayTemporal1);
                    trace ("valor actual del array colQuimicaTemporal: "+arrayTemporal2);
                    if (arrayTemporal2[k] != movieClipString) {
                        trace ("MovieClip no está en la columna quimica");
                        if (arrayTemporal1[j] != movieClipString){
                            trace ("MovieClip no está en la columna mecanica, así que lo graba");
                            _root.arrayColMecanicaResp.push(movieClipString);
                        }else{
                            trace ("MovieClip ya está en la columna mecanica, no hace nada");
                        }
                    }else{
                        trace ("MovieClip ya estaba en la columna química, borrarlo");
                        trace ("MovieClip no está, logicamente, en la columna mecanica, así que lo graba");
                        //delete _root.arrayColQuimicaResp[k];
                        _root.arrayColQuimicaResp.removeItem(movieClipString);
                        _root.arrayColMecanicaResp.push(movieClipString);
                    }
                } else if (eval(movieClip._droptarget) == colQuimica) {
                    trace ("valor inicial del array colQuimica: "+_root.arrayColMecanicaResp);
                    trace ("valor actual del array colMecanicaTemporal: "+arrayTemporal1);
                    trace ("valor actual del array colQuimicaTemporal: "+arrayTemporal2);
                    if (arrayTemporal1[j] != movieClipString) {
                        trace ("MovieClip no está en la columna mecanica");
                        if (arrayTemporal2[k] != movieClipString){
                            trace ("MovieClip no está en la columna quimica, así que lo graba");
                            _root.arrayColQuimicaResp.push(movieClipString);
                        }else{
                            trace ("MovieClip ya está en la columna quimica, no hace nada");
                        }
                    }else{
                        trace ("MovieClip ya estaba en la columna mecanica, borrarlo");
                        trace ("MovieClip no está, logicamente, en la columna quimica, así que lo graba");
                        _root.arrayColMecanicaResp.removeItem(movieClipString);
                        _root.arrayColQuimicaResp.push(movieClipString);
                    }
                }
                trace ("array respondidas ejercicio**"+_root.respondidasEjer);
                trace ("************************************************************************");
            }
        }
    }
}
function comparaArraysQuimica() {
    //trace ("compara quimica");
    var arrayColQuimicaRespTemp:Array = _root.arrayColQuimicaResp.slice();    
    arrayColQuimicaRespTemp.sort();
    trace ("Array Correctas Quimica Ejercicio: "+arrayColQuimica);
    trace ("Array Respondidas Quimica Ejercicio: "+arrayColQuimicaRespTemp);
    for (var l = 0; l<arrayColQuimica.length; l++) {
        for (var m = 0; m<arrayColQuimicaResp.length; m++) {
            if (arrayColQuimica[l] == arrayColQuimicaRespTemp[m]) {
                trace ("correctas"+arrayColQuimica[l]);
                trace ("respondidas"+arrayColQuimicaRespTemp[m]);
                trace ("Felicidades, esta respuesta en columna química es correcta: "+arrayColQuimicaRespTemp[m]);
            }
        }
    }
    delete arrayColQuimicaRespTemp;
}

function comparaArraysMecanica() {
    //trace ("compara mecanica");
    var arrayColMecanicaRespTemp:Array = _root.arrayColMecanicaResp.slice();    
    arrayColMecanicaRespTemp.sort();
    trace ("Array Correctas Mecanica Ejercicio: "+arrayColMecanica);
    trace ("Array Respondidas Mecanica Ejercicio: "+arrayColMecanicaRespTemp);
    for (var n = 0; n<arrayColMecanica.length; n++) {
        for (var o = 0; o<arrayColMecanicaRespTemp.length; o++) {
            if (arrayColMecanica[n] == arrayColMecanicaRespTemp[o]) {
                trace ("correctas: "+arrayColMecanica[n]);
                trace ("respondidas: "+arrayColMecanicaRespTemp[o]);
                trace ("Felicidades, esta respuesta en la columna mecánica es correcta: "+arrayColMecanicaRespTemp[o]);
            }
        }
    }
    delete arrayColMecanicaRespTemp;
}

with (ejercicio) {
    pap_amarillentos.onPress = function() {
        this.startDrag();
    };
    pap_amarillentos.onRelease = function() {
        this.stopDrag();
        _root.colocaTextos(pap_amarillentos);
    };
    pap_barata.onPress = function() {
        this.startDrag();
    };
    pap_barata.onRelease = function() {
        this.stopDrag();
        _root.colocaTextos(pap_barata);
    };
    pap_cara.onPress = function() {
        this.startDrag();
    };
    pap_cara.onRelease = function() {
        this.stopDrag();
        _root.colocaTextos(pap_cara);
    };
    pap_mas_blanca.onPress = function() {
        this.startDrag();
    };
    pap_mas_blanca.onRelease = function() {
        this.stopDrag();
        _root.colocaTextos(pap_mas_blanca);
    };
    pap_mas_blancos.onPress = function() {
        this.startDrag();
    };
    pap_mas_blancos.onRelease = function() {
        this.stopDrag();
        _root.colocaTextos(pap_mas_blancos);
    };
    pap_mas_cuerpo.onPress = function() {
        this.startDrag();
    };
    pap_mas_cuerpo.onRelease = function() {
        this.stopDrag();
        _root.colocaTextos(pap_mas_cuerpo);
    };
    pap_menos_blanca.onPress = function() {
        this.startDrag();
    };
    pap_menos_blanca.onRelease = function() {
        this.stopDrag();
        _root.colocaTextos(pap_menos_blanca);
    };
    pap_menos_cuerpo.onPress = function() {
        this.startDrag();
    };
    pap_menos_cuerpo.onRelease = function() {
        this.stopDrag();
        _root.colocaTextos(pap_menos_cuerpo);
    };
    pap_no_quita_lignina.onPress = function() {
        this.startDrag();
    };
    pap_no_quita_lignina.onRelease = function() {
        this.stopDrag();
        _root.colocaTextos(pap_no_quita_lignina);
    };
    pap_opacos.onPress = function() {
        this.startDrag();
    };
    pap_opacos.onRelease = function() {
        this.stopDrag();
        _root.colocaTextos(pap_opacos);
    };
    pap_quita_lignina.onPress = function() {
        this.startDrag();
    };
    pap_quita_lignina.onRelease = function() {
        this.stopDrag();
        _root.colocaTextos(pap_quita_lignina);
    };
    botonVerificar.onRelease = function() {
        if ((_root.arrayColQuimica.length+_root.arrayColMecanica.length) > (_root.arrayColQuimicaResp.length+_root.arrayColMecanicaResp.length)){
            trace ("Debes de agrupar todas las palabras en la columna correspondiente");
        }else{
            _root.comparaArraysMecanica();
            _root.comparaArraysQuimica();
        }
    };
} 


La dirección al archivo ya swf:
http://percepcionunitaria.org/pruebas/09_dpbp_ejercicio01.swf

Lo que necesito es que al momento de apretar el boton de validar, revise qué palabras están bien soltadas en la columna correspondiente y qué palabras no.

¿Alguna idea?
Gracias :)

Por yconoclasta

12 de clabLevel



Genero:Masculino  

diseñador aventurero soñador

firefox
Citar            
MensajeEscrito el 25 Jun 2007 09:39 pm
Para comparar arrays únicamente crea una función que a través de bucles compare todos los items:

Código :

function comprueba_arrays(array1:Array, array2:Array)
{
   var correctos:Number = 0;
   for (var i in array1) {
      var item:String = array1[i];
      for (var ii in array2) {
         if (item == array2[ii]) {
            correctos++;
         }
      }
   }
   trace("items correctos: " + correctos);
   if (correctos == array2.length) {
      trace("Array completo");
   } else {
      trace("Array incompleto");
   }
}

Apartir de ahí le pasar como parametro a la función tu array y el array con los items correctos:

Código :

var array_ok:Array = new Array("uno", "dos", "tres", "cuatro", "cinco");
var array:Array = new Array("dos", "cuatro", "tres", "uno", "seis");
comprueba_arrays(array, array_ok);

este ejemplo te dará:
items correctos: 4
Array incompleto

Por Zguillez

BOFH

10744 de clabLevel

85 tutoriales
17 articulos
3 ejemplos

Genero:Masculino   Bastard Operators From Hell Héroes Team Cristalab Editores

BCN

firefox
Citar            
MensajeEscrito el 25 Jun 2007 10:50 pm
Muchas gracias Zguillez por tu pronta respuesta.

Está bien la función que pones de ejemplo, pero no me funciona del todo. Necesito recuperar los elementos correctos por nombre y los elementos incorrectos para por medio de otra función colocar una imagen de una palomita o un tache en su caso y dar retroalimentación al usuario para que sepa en qué se equivocó o acertó.

La función que tengo ya me da el valor acertado de la comparación entre los arreglos, pero no encuentro aun como sacar los errores.

Código :

var arrayColQuimica:Array = new Array("pap_cara", "pap_mas_blanca", "pap_mas_blancos", "pap_menos_cuerpo", "pap_quita_lignina");
var arrayColQuimicaResp:Array = new Array("pap_amarillentos", "pap_barata", "pap_mas_blancos", "pap_menos_cuerpo", "pap_quita_lignina");
function comparaArraysQuimica() {
    //trace ("compara quimica");
    var arrayColQuimicaRespTemp:Array = _root.arrayColQuimicaResp.slice();    
    arrayColQuimicaRespTemp.sort();
    trace ("Array Correctas Quimica Ejercicio: "+arrayColQuimica);
    trace ("Array Respondidas Quimica Ejercicio: "+arrayColQuimicaRespTemp);
    for (var l = 0; l<arrayColQuimica.length; l++) {
        for (var m = 0; m<arrayColQuimicaResp.length; m++) {
            if (arrayColQuimica[l] == arrayColQuimicaRespTemp[m]) {
                trace ("correctas"+arrayColQuimica[l]);
                trace ("respondidas"+arrayColQuimicaRespTemp[m]);
                trace ("Felicidades, esta respuesta en columna química es correcta: "+arrayColQuimicaRespTemp[m]);
            }
        }
    }
    delete arrayColQuimicaRespTemp;
}

Por yconoclasta

12 de clabLevel



Genero:Masculino  

diseñador aventurero soñador

firefox
Citar            
MensajeEscrito el 25 Jun 2007 11:18 pm
Solo tienes que adpatar la funcion a tus necesidades.
Por ejemplo que te genere unos arrays con los items correctos e incorrectos:

Código :

function comprueba_arrays(array1:Array, array2:Array) {
   var bien:Array = new Array();
   var mal:Array = new Array();
   var correctos:Number = 0;
   for (var i in array1) {
      var item:String = array1[i];
      var ok:Boolean = false;
      for (var ii in array2) {
         if (item == array2[ii]) {
            bien.push(item);
            ok = true;
            correctos++;
         }
      }
      if (!ok) {
         mal.push(item);
      }
   }
   trace("items correctos: "+correctos);
   if (correctos == array2.length) {
      trace("Array completo");
   } else {
      trace("Array incompleto");
      trace("Estos son los items correctos: "+bien);
      trace("Estos son los items incorrectos: "+mal);
   }
}

items correctos: 4
Array incompleto
Estos son los items corractos: uno,tres,cuatro,dos
Estos son los items incorrectos: seis

Por Zguillez

BOFH

10744 de clabLevel

85 tutoriales
17 articulos
3 ejemplos

Genero:Masculino   Bastard Operators From Hell Héroes Team Cristalab Editores

BCN

firefox
Citar            
MensajeEscrito el 25 Jun 2007 11:29 pm

Código :

function comparaArraysQuimica() {
    //trace ("compara quimica");
    var arrayColQuimicaRespTemp:Array = _root.arrayColQuimicaResp.slice();
    arrayColQuimicaRespTemp.sort();
    trace ("Array Correctas Quimica Ejercicio: "+arrayColQuimica);
    trace ("Array Respondidas Quimica Ejercicio: "+arrayColQuimicaRespTemp);
    for (var m = 0; m<arrayColQuimicaResp.length; m++) {                      // para cada respuesta (no importa si no estan en orden)
        swOk = false; // variable para saber si es correcta o no la respuesta
        for (var l = 0; l<arrayColQuimica.length; l++) {                             // ver si esta dentro de las respuestas correctas
            if (arrayColQuimica[l] == arrayColQuimicaRespTemp[m]) {
                swOK = true;
                trace ("correctas"+arrayColQuimica[l]);
                trace ("respondidas"+arrayColQuimicaRespTemp[m]);
                trace ("Felicidades, esta respuesta en columna química es correcta: "+arrayColQuimicaRespTemp [m]);
            }
        }
       if (swOK) {
           // aqui colocas el código para cuando la respuesta es correcta
           // colocas la palomita
       } else {
           // aqui colocas el codigo para cuando la respuesta es incorrecta
           // colocas el tache
       }
    }
    delete arrayColQuimicaRespTemp;
}

espero que te sirva...

Por gabynufe

Claber

446 de clabLevel



 

México, D.F.

msie7
Citar            
MensajeEscrito el 26 Jun 2007 02:40 am
Muchísimas gracias gabynufe y Zguillez !!!!
Sabía que debía de poner una variable booleana pero no sabía dónde :lol:

No cabe duda de que cuando uno se bloquea, uno se bloquea!
Les invito una cerveza virtulal !

Salud.

Por yconoclasta

12 de clabLevel



Genero:Masculino  

diseñador aventurero soñador

firefox

 

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