Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

acceso .Max en Array dentro de array (clase serializable?)

Iniciado por farenhai, Marzo 15, 2016, 02:38:11 PM

Tema anterior - Siguiente tema
Marzo 15, 2016, 02:38:11 PM Ultima modificación: Marzo 15, 2016, 02:40:28 PM por farenhai
A ver cómo explico esto (entiendo que será más fácil de lo que pienso, pero...) Tengo un grupo de arrays que me interesa tener relacionados entre sí (para simplificar lo dejaré en 2 variables)-string Variable 1 - int Variable 2Necesito hallar los números máximos de Variable 2. Usaré el índice de Variable2.Max para seleccionar el string de Variable1. (las variables van pareadas, vaya)De manera que hago un array dentro de la clase (no sé si es ésta la mejor manera de expresarlo, pero bueno...) y esto es lo que me queda:  using System.Collections;using System.Linq;[System.Serializable]public class MyPairs{public string variable1;public int variable2;} public class Script1 : Monobehaviour{public MyPairs [ ] objetoArray;} Hasta aquí, todo genial: puedo desplegar tantos array como quiera y es perfecto (creo) para lo que intento hacer. Con Debug.Log (objetoArray.variable1);  puedo determinar sin problemas el valor de cada una de las dos variables. Genial. El problema es que no encuentro la manera de aplicar la función Linq.Max a la variable 2, esto es: encontrar el valor máximo de variable 2 dentro de todo el array. La pregunta es: ¿Cómo lo hago? He escrito y buscado unas cuantas combinaciones, pero no consigo hacer que funcione... Lo que, en mi pobre entendimiento, sería medio-lógico:objetoArray.variable2.Max , pero Unity no reconoce esa construcción (ya había probado el .Max en algún que un array común)... ¿¿¿¿Ayuda, please???? Mil gracias!!

Marzo 15, 2016, 03:27:57 PM #1 Ultima modificación: Marzo 15, 2016, 03:29:07 PM por ftejada
Hola!Yo la verdad es que aun no he trabajado con la biblioteca "System.Linq"Por lo que creo entender al leerte, lo que quieres recoger es la variable2 que mas valor tenga de todas las variables2 de los arrays que tienes metidos en objetoArray. Es correcto? Si no fuese así disculpa mi respuesta/solucionIntenta esto:
public class Script1 : Monobehaviour

{

    public MyPairs [ ] objetoArray;
   
    //hazla publica si la vas a necesitar llamarla desde otro script
    int funcionEncontrarVarMax()
    {
        int valorMax;   //Para comparar el valor con el del siguiente index
        int index;      //Para almacenar el indice en el que está el array que contiene la variable2 con mayor valor
        for(int i = 0; i < objetoArray.length; i++)
        {
            if(i == 0)
            {
                //como es el primero almacenamos los valores
                index = i;
                valorMax = objetoArray.variable2;
            }
            else
            {
                //Comparamos si es mayor para tener almacenado el valor max
                if(objetoArray.variable2 > valorMax)
                {  
                    //Si era mayo sustituimos los valores anteriores
                    index    = i;
                    valorMax = objetoArray.variable2;
                }
            }
        }
       
        //Ahora que ya se han comprobado todos solo tienes que utilizar la variable index
        //para obtener el valor max
        return objetoArray[index].variable2;
    }
   
   

}
Lo acabo de hacer sobre la marcha y no se si funciona correctamente. Pruebalo y me dices Saludos....

Hola Ftejada, y ante todo, mil gracias por tu aporte! Efectivamente, has comprendido bien, es eso lo que pretendo hacer. Le echaré un ojo a lo que propones, porque mi principal motivación es aprender. Ya había encontrado algo parecido en otro foro (no recuerdo si en stackflow) una propuesta parecida.De cualquier modo (y aunque esto podría ser una solución) , si alguno de los compañeros me sabe explicar en qué estoy fallando a la hora de aplicar el variable2.Max... el problema de la solución que propones se resume en que el juego que proyecto incluye ciertas estadísticas (muy, muy básicas, pero mucho número al final) y utilizar las librerías System.Linq pueden ahorrar muchas líneas de código (máximo de la variable 2, mínimo de la variable3, media de la variable 4, etc...Con Linq tengo muchos de esos valores predefinidos y sería genial poder aprovecharlos... 

Hola farenhai,lo bueno de la libreria Linq, ademas de que tiene funciones establecidas para trabajar con coleciones de objetos (como las que has comentado de encontrar el minimo, maximo o la media entre otras muchas), es que te permite utilizar predicados en dichas funciones y con estos es posible modificar el comportamiento preestablecido. Tal vez por ahi este la solucion si quieres limitarte a la libreria Linq

¡Hola, Arthure! Gracias por la pista.. ignoraba lo de los "predicados"... investigaré a ver qué encuentro... ... no es que quiera limitarme a las libreria Linq, pero es que según lo que estoy haciendo, me da la sensación de que debe ser de lo más práctico... se admiten más sugerencias, de cualquier modo... a fin de cuentas, no tengo ni idea de lo que estoy haciendo!!! (OMG, qué difícil es aprender xD)

[quote author=ftejada date=1458052077" data-ipsquote="" data-cite="ftejada" class="ipsQuote">Hola!Yo la verdad es que aun no he trabajado con la biblioteca "System.Linq"Por lo que creo entender al leerte, lo que quieres recoger es la variable2 que mas valor tenga de todas las variables2 de los arrays que tienes metidos en objetoArray. Es correcto? Si no fuese así disculpa mi respuesta/solucionIntenta esto:
public class Script1 : Monobehaviour{

    public MyPairs [ ] objetoArray;
   
    //hazla publica si la vas a necesitar llamarla desde otro script
    int funcionEncontrarVarMax()
    {
        int valorMax;   //Para comparar el valor con el del siguiente index
        int index;      //Para almacenar el indice en el que está el array que contiene la variable2 con mayor valor
        for(int i = 0; i < objetoArray.length; i++)
        {
            if(i == 0)
            {
                //como es el primero almacenamos los valores
                index = i;
                valorMax = objetoArray[i].variable2;
            }
            else
            {
                //Comparamos si es mayor para tener almacenado el valor max
                if(objetoArray[i].variable2 > valorMax)
                {  
                    //Si era mayo sustituimos los valores anteriores
                    index    = i;
                    valorMax = objetoArray[i].variable2;
                }
            }
        }
       
        //Ahora que ya se han comprobado todos solo tienes que utilizar la variable index
        //para obtener el valor max
        return objetoArray[index].variable2;
    }
   
   

}
Lo acabo de hacer sobre la marcha y no se si funciona correctamente. Pruebalo y me dices Saludos....[/quote]Pues después de varios días peleándome con la librería Linq sin conseguir grandes avances, me he puesto con tu propuesta. Analizandola con un poco de calma, es de lo más lógica. Funciona perfectamente, salvo la última línea (unity no me acepta hacer un return y lo sustituí por un debug ( "A return keyword must not be followed by any expression when returns void") y efectivamente, da el valor adecuado (aunque yo he tenido que usar valorMax porque, según esta estructura, "i" se quedaba sin declaración.  En cualquier caso, valorMax devuelve el valor máximo dado. ¡Gracias!  [quote author=Arthure date=1458055998" data-ipsquote="" data-cite="Arthure" class="ipsQuote">Hola farenhai,lo bueno de la libreria Linq, ademas de que tiene funciones establecidas para trabajar con coleciones de objetos (como las que has comentado de encontrar el minimo, maximo o la media entre otras muchas), es que te permite utilizar predicados en dichas funciones y con estos es posible modificar el comportamiento preestablecido. Tal vez por ahi este la solucion si quieres limitarte a la libreria Linq [/quote]Hola Arthure! He intentado indagar (admito que no a super-full) sobre los predicados de las librerías linq, pero no consigo encontrar solución a mi problema. Te cuento:Llegué a hacer funcionar los valores de un array dentro de un array, siendo ésta la estructura resultante:                  ArrayPrincipal1                             - ArrayEnArray1                                                - Variable1                                                - Variable2                            - VariableNoArray1                            - ArrayEnArray2                                                 - Variable1                                                 - Variable2                            - VariableNoArray2 Como podrás imaginar, lo que pretendía (no me había dado cuenta hasta tiempo después de poner el post y seguir la pista de tu comentario, gracias! ;)

Analizandola con un poco de calma, es de lo más lógica. Funciona perfectamente, salvo la última línea (unity no me acepta hacer un return y lo sustituí por un debug ( "A return keyword must not be followed by any expression when returns void") y efectivamente, da el valor adecuado (aunque yo he tenido que usar valorMax porque, según esta estructura, "i" se quedaba sin declaración.[/quote]Ese error creo que debe ser por que cuando creas la funcion "funcionEncontrarVarMax() has debido declararla con void en vez de con int... fijate bien en eso, sino el return de da error
//hazla publica si la vas a necesitar llamarla desde otro script
void funcionEncontrarVarMax()  //Forma incorrecta con void
int funcionEncontrarVarMax()   //Forma correcta
 Por otro lado no se a qué te refieres en lo que te puesto en rojo. Saludos.

[quote author=ftejada date=1458561801" data-ipsquote="" data-cite="ftejada" class="ipsQuote">Ese error creo que debe ser por que cuando creas la funcion "funcionEncontrarVarMax() has debido declararla con void en vez de con int... fijate bien en eso, sino el return de da error

int funcionEncontrarVarMax()   //Forma correcta
 Por otro lado no se a qué te refieres en lo que te puesto en rojo. Saludos.[/quote]Ahhhh! CORRECTO: lo había hecho con void... no conocía todavía esa funcionalidad de las variables  gracias!!!

[quote author=farenhai" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35394" data-ipsquote-contentcommentid="128471">Ahhhh! CORRECTO: lo había hecho con void... no conocía todavía esa funcionalidad de las variables

El máximo de variable2 en la clase MyPairs en Linq es:int maxv = MyPairs.Max(item => item.variable2);

Cita de: iRobb date=1458608923" data-ipsquote="" data-cite="iRobb" class="ipsQuoteEl máximo de variable2 en la clase MyPairs en Linq es:int maxv = MyPairs.Max(item => item.variable2);
Maravilloso! Gracias!

Etiquetas: