Comunidad de diseño web y desarrollo en internet online

Extraer el valor mínimo contenido en un array

Citar            
MensajeEscrito el 02 Abr 2006 05:40 pm
Durante la ejecución de una película el usuario va introduciendo datos que se almacenan en un
array. Al final se trata de extraer cual es el valor mínimo y máximo de la serie de variables generadas.
En la libreria de actionscript.org encontré :
//Retreiving Max Value From An Array
function getMaxVal(x) {
max = Number(x[0]);
for(i=0;i<x.length;i++){
t_max = Number(x[i]);
if(t_max>max){
max = t_max;
}else{
max = max;
}
}
return(max);
}

myArray = [200,499,234,37,576,167,273];
trace(getMaxVal(myArray));


Os pido que me ayudeis a modificar este código para obtener el valor mínimo.

Por lonesome

7 de clabLevel



 

msie
Citar            
MensajeEscrito el 02 Abr 2006 06:58 pm
:roll:

Código :

//Retreiving Max Value From An Array 
function getMaxVal(x) {
   max = Number(x[0]);
   for(i=0;i<x.length;i++){
      t_max = Number(x[i]);
      if(t_max<max){ // Cambiamos ">" (mayor) por "<" (menor)
         max = t_max;
      }
   }
   return(max);
}

Por gparis

112 de clabLevel



 

Uruguay

opera
Citar            
MensajeEscrito el 03 Abr 2006 05:53 am

Código :

var myArray:Array = Array(200,499,234,37,576,167,273);

function getValues(subject:Array):Array{
   var max:Number=subject[0];
   var min:Number=subject[0];
   for (var i in subject){
      if (subject[i]>max){
         max=subject[i]
      }
      if (subject[i]<min){
         min= subject[i];   
      }
   }
   return [min,max];
}
values = getValues(myArray);
trace("Min: "+values[0]+ "Max: "+values[1]);

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 03 Abr 2006 08:01 am
mucho más sencillo y rápido:

Código :

MIN = myArray.sort(16).slice(0,1));
MAX = myArray.sort(16).slice(-1));


o, para no modificar el array original y extraer solamente el valor:


Código :

nA= myArray; 
MIN = nA.sort(16).slice(0,1));
MAX = nA.sort(16).slice(-1));
delete nA  

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

msie
Citar            
MensajeEscrito el 03 Abr 2006 05:25 pm
Sois formidables. Gracias.
Mi array se genera inicialmente conteniendo variables cuyo valor es 0 (cero). Cuando el usuario ha intervenido ciertos
elementos(variables) adquieren un valor superior distinto (entre 101 y 401) pero en el array siguen presentes muchos
elementos cuyo valor sigue siendo 0. Ningún problema para extraer el MAXIMO pero el MINIMO siempre resulta ser 0,
luego pienso que antes debería "purgar" el array eliminando todos los elementos cuyo valor siga siendo el inicial o sea 0.
He buscado por ahí antes de recurrir al foro, pero no di con nada que pudiera serme útil.
Espero un poco más de ayuda para superar este nuevo escollo.

Por lonesome

7 de clabLevel



 

msie
Citar            
MensajeEscrito el 03 Abr 2006 05:30 pm

Código :

      if(t_min<min && t_min!=0){ // AGREGAMOS LA CONDICION DISTINTO DE CERO
         min = t_miin;
      }

Por gparis

112 de clabLevel



 

Uruguay

opera
Citar            
MensajeEscrito el 03 Abr 2006 06:46 pm
Prueba así:

Código :

miArray= new Array (23,0,99,0,456,28,0,0,1,33,23,0)

function minimo(A){
   var ct=0;
   while (!min || ct==A.length){
       min= A[A.sort(8|16).slice(ct,ct+1)]
      ct++;
   }
   return min;
}

function maximo(A){
   return  A[A.sort(2|8|16).slice(0,1)]
}

trace(miArray);// salida: 23,0,99,0,456,28,0,0,1,33,23,0
trace(minimo(miArray))  // salida: 1
trace (maximo(miArray)) // salida: 456  
trace(miArray);// salida (no se modifica el array original): 23,0,99,0,456,28,0,0,1,33,23,0

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

msie
Citar            
MensajeEscrito el 03 Abr 2006 06:58 pm
Error:
La condición while correcta es:

while (!min && ct!=A.length)

a veces me patinan las neuronas. :oops:

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

msie
Citar            
MensajeEscrito el 03 Abr 2006 07:24 pm
Teseo, estoy probando tu código pero después del primer trace me salta un aviso de Flash Player advirtiéndome que el
script esta provocando que la película se ejecuta muy lentamente y que podría dejar de responer y me propone detener
la ejecución del script.
Antes de tu respuesta yo había seguido buscando hasta dar con un script en http://proto.layer51.com/d.aspx?f=749
Array : Find and remove values (msg8)
// buscar y eliminar elementos en un array
Array.prototype.findAndRemove = function(toRemove) {
var s = this.toString()+",";
var t = s.split(toRemove+",");
var u = t.join("");
u = u.substr(0, u.length - 1);
var v = u.split(",");
return v;
};
// nuevo array después de la intervención del usuario )
myArray = new Array(0, 0, 0, 0, 9, 10, 11, 12, 13, 14, 15, 16, 17);

y esta es la salida haciendo trace(myArray) // 9,111,12,13,14,15,16,17
haciendo trace(maxValue) //111
y trace(minValue) // 9

o sea que concatena la "purga" del elemento cuyo valor era 10 con el elemento cuyo valor era 11 dando como resultado un elemento cuyo valor es 111.

Si pudieras ayudarme tanto a revisar el código que me has enviado para que no surja el aviso de Flash Player o a
revisar el que yo encontré para que solo elimine el cero de los elementos cuyo valor sea 0 y no extienda el criterio
a aquellos que simplemente lo contengan (p.ej. 10, 101, 100, 190, 200, 201, etc.)

Por lonesome

7 de clabLevel



 

msie
Citar            
MensajeEscrito el 03 Abr 2006 07:37 pm
Ya te conteste un post despues.........un error en la condición while.

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

msie
Citar            
MensajeEscrito el 03 Abr 2006 08:44 pm
Ufff... despiste mio, lo lamento no vi tu ultimo post con el error en while...tranquilo que tienes neuronas para rato.
voy a aplicarme el cuento

Por lonesome

7 de clabLevel



 

msie
Citar            
MensajeEscrito el 03 Abr 2006 09:05 pm
Después de cambiar el enunciado de la condición while
trace(minimo(miArray)); // devuelve "undefined"
trace(maximo(miArray)); // también devuelve "undefined
La sintaxis de las funciones parece correcta.

Por lonesome

7 de clabLevel



 

msie
Citar            
MensajeEscrito el 03 Abr 2006 09:24 pm
Lo he probado y es correcto así, solo que he ahora suprimido los OR que habia dejado sin operar para más claridad.
Si te entrega undefined es que no le pasas un array ......revisa tu implementación. Este ejemplo corre perfectamente cambies como cambies el array. Incluso uno de todo ceros.


Código :

miArray= new Array (23,0,99,0,456,28,0,0,1,33,23,0)

function minimo(A){
   var ct=0;
   while (!min && ct!=A.length){
       min= A[A.sort(-8).slice(ct,ct+1)]
      ct++;
   }
   return min;
}

function maximo(A){
   return  A[A.sort(26).slice(0,1)]
}

trace(miArray);// salida: 
trace(minimo(miArray))  // salida: 1
trace (maximo(miArray)) // salida: 456  
trace(miArray);// salida sin modificación: 23,0,99,0,456,28,0,0,1,33,23,0

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

msie
Citar            
MensajeEscrito el 03 Abr 2006 10:06 pm
Respondo una pregunta privada aquí pues tiene que ver con esto.

La instrucción sort usa solo un byte para el parámetro options de modo que los OR que ejecuta son iguales al complemento.

Dicho de otro modo:
sort( 8 | 16 ) como 8 | 16 = 24 es igual que poner
sort( 24 ) ---> 8 + 16 = 24 e identico a
sort( -8 ) ----> 8 - 16 = -8 por tomar solo un byte.

De igual modo:
sort ( 2| 8| 16 ) es igual que sort(26) ----> 2 + 8 + 16 e igual a sort(-6) ---> 2 + (8-16) = 2 - 8 = -6

Significando 2 descendente, 8 coger los indices (no los valores) y 16 considerarlos como números

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

msie
Citar            
MensajeEscrito el 03 Abr 2006 10:39 pm
para Teseo
Pues , de verdad que siento tener que molestarte, pero sigo con el "undefined" para las salidas de minimo y maximo.
Vaya por delante el reconocimiento de mi ignorancia pero cuando dices " si te integra undefined es que no le pasas un
array...revisa tu implementación" no se si te refieres a que hay que declarar y construir otros arrays para que las function
minimo y maximo trabajen con ellos...
Yo repito al pié de la letra tu código sin declarar ni construir otro array que el que aparece en la primera línea aunque
desde hace rato me pregunto por la vinculación del parámetro A en function minimo(A){ y en function maximo(A){
En cualquier caso te agradezco la cooperación que me has brindado

Por lonesome

7 de clabLevel



 

msie
Citar            
MensajeEscrito el 04 Abr 2006 02:18 am
Pues te pongo un SWF para que lo veas actuar:

(los 0 que se introduzcan al array no cuentan para max o min)

http://www.telecable.es/personales/terepardo1/SWFs/array%20maxmin.swf


y el código que lleva:

Código :

/*
En el stage:
un boton: botonN
un campo de introducción de texto:           num
un campo de texto dinámico con variable:    maxim
un campo de texto dinámico con variable:    minim
un campo de texto dinámico con variable:    miA 
*/
miArray=[]
cont=0;

botonN.onPress= function(){
   miArray[cont]= Number(num);
   miA  = miArray;
   cont++;
   maxim = maximo(miArray);
   minim = minimo(miArray);
}

function maximo(A){
   return  A[A.sort(-8).slice(-1)];
}
function minimo(A){
    ct =0;
    min= 0;
   while (!min && ct!=A.length){
      min= A[A.sort(24).slice(ct,ct+1)];
      ct++;
   }   
   return min;
}

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

msie
Citar            
MensajeEscrito el 04 Abr 2006 04:39 pm
Ya vi la movie en acción y me convenciste plenamente. Sin embargo sigo como ayer, es decir, con los resultados de maximo y
minimo como "undefined".
Además me construi un .fla siguiendo al pie de la letra tus instrucciones ( elementos del stage y AS ) y los resultados de
las function "maximo" y "minimo" dan "undefined" utilizando el depurador del player.
No se si la cosa va del nivel de Actionscript ( yo uso FlashMX ), pero si fuera médico seguro que este paciente se me iba al
cielo.
No me queda más que pedirte, abusando un poco más de tu extrema atención, que si puedes adjuntarme tu propio .fla
en algún mail dirigido a mi cuenta ( como soy nuevo en este foro no se si se pueden escribir aquí las direcciones).
Lo dejo en tus manos, pero en cualquier caso, muy agradecido.

Por lonesome

7 de clabLevel



 

msie
Citar            
MensajeEscrito el 04 Abr 2006 05:08 pm
pincha en mi nombre y mándame tu e-mail al que tengo ahí.
Aunque el código del FLA es el que posteo arriba con los botones y los campos necesarios nada más.

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

msie

 

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