He visto varios tutoriales en línea de cómo detectar un valor duplicado en una Array (matriz) y de cómo eliminar esos valores. Eso es muy útil cuando solamente se desea tener un valor único e irrepetible dentro de una matriz. Sin embargo, habrá ocasiones en que queremos saber cuántas veces se repetía ese valor dentro del Array.
Hasta ahora no he visto alguno que te diga en cuántas ocasiones estuvieron presentes los diferentes valores duplicados de las cadenas en una matriz. Así que decidí escribir un sencillo tutorial al respecto.
Vamos a pensar en el siguiente ejemplo. Tengo un Array o matriz que se llama nombreDePersonas. Ese array tiene guardado el nombre de diferentes personas, por ejemplo: Mariana, Ana, Julia, Mauricio, Fernando, María Luisa, etc. Si lo escribiéramos en AS3 quedaría así:
var nombreDePersonas:Array = ["Mariana", "Ana", "Fernando", "Julia", "Mariana", "Ana", "Ana", "Mauricio", "María Luisa"];
La pregunta aquí es cómo se podría hacer para que se muestren cuántos nombres de personas repetidos hay en la matriz, por ejemplo: Mariana = 2, Ana = 3, Mauricio = 1, etc.
Una posible solución, podría ser establecer las variables para cada elemento, pero el problema aquí es que si se tienen cientos o miles de nombres de personas, sería casi imposible escribir nuevas variables para cada persona. Por ejemplo:
function recontarNombres(personaCadena: Array, personaNombre: String): int {
var contar: int = 0;
for (var i: int = 0; i < personaCadena.length; i++) {
if (personaCadena[i].toLowerCase() == personaNombre.toLowerCase()) {
contar++;
}
}
return contar;
}
var contarMariana = recontarNombres(nombreDePersonas, "Mariana"); //nos regresa 2
var contarAna = recontarNombres(nombreDePersonas, "Ana"); //nos regresa 3
var contarMauricio = recontarNombres(nombreDePersonas, "Mauricio"); //nos regresa 1
Así que pensando un poco diferente, una mejor opción para este caso, es guardar los valores dentro de un objeto vacío, que contendrá los valores de los contadores para cada persona. De tal forma que ese objeto guardaría la información en una estructura que quedaría más o menos así: {nombre de la persona: Conteo}.
Para entenderlo más claro, vamos a ver el siguiente ejemplo:
var nombreDePersonas: Array = ["Mariana", "Ana", "Fernando", "Julia", "Mariana", "Ana", "Ana", "Mauricio", "María Luisa"];
var personaNombre: String;
var mapa: Object = {};
// Para cada cadena de la matriz repetir y aumentar el contador en 1 cada vez que aparece esa cadena
for each(personaNombre in nombreDePersonas) {
if (!mapa[personaNombre]) {
//Cuando se encuentre por primera vez el nombre de la persona, asigne al contador el valor de 1
mapa[personaNombre] = 1;
}
else {
//Al encontrar el nombre de la persona en más de una ocasión, se incrementa el contador en 1
mapa[personaNombre]++;
}
}
//Repetir las propiedades del mapa para ver los resultados
for (personaNombre in mapa) {
trace(personaNombre, " = ", mapa[personaNombre]);
}
Si todo ha sido escrito correctamente en el código, al publicar la película, en el panel de salida de Flash, debería mostrarse lo siguiente:
Mauricio = 1
Ana = 3
María Luisa = 1
Fernando = 1
Julia = 1
Mariana = 2
Espero que este tutorial les sirva de ayuda para el proyecto que estén realizando.
Cuando se suscriba al blog, le enviaremos un correo electrónico cuando haya nuevas actualizaciones en el sitio para que no se las pierda.