Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - reygecko

#1
Java / Re: Duda general sobre 'static'
18 Enero 2013, 15:58 PM
Sois unos ***** genios.   ;-)

Y yo soy un puto ignorante que pregunta estupideces, soy un borrico, borrico, borrico...

De verdad, muchísimas gracias a todos por vuestra ayuda.  No sé qué haría sin ella.  Voy a ponerme con el código a ver si le saco algún provecho.

#2
Java / Re: Duda general sobre 'static'
18 Enero 2013, 15:53 PM
Cita de: Novlucker en 18 Enero 2013, 14:00 PM
Sin el código es algo difícil de darte respuesta.

Static se refiere a que el valor de una propiedad no depende de una instancia de clase, creo que con esto te tiene que quedar más claro.
También tu problema puede ser que a la hora de agregar los objetos al ArrayList, estas reutilizando la instancia del mismo objeto en lugar de hacer un new cada vez, y por ende estas agregando el mismo objeto muchas veces.

Saludos

Ya había consultado ayer el enlace que me has puesto, por eso creo que el problema podría estar en el 'static'.  

Sin embargo, me parece muy interesante tu indicación sobre hacer un new cada vez que agrego un objeto al ArrayList.  Ahora lo estoy haciendo con este código: "lista.add(test)", donde test es un objeto tipo TAD del que voy variando sus valores uno a uno.  ¿No debería hacerlo así? ¿Cuál sería entonces el modo correcto?

Gracias por adelantado.  :)
#3
Java / Re: Duda general sobre 'static'
18 Enero 2013, 15:47 PM
Cita de: RevangelyonX en 18 Enero 2013, 13:49 PM
Hola,

No acabo de enteder o visualizar tu código es posible que pegues alguna parte?
Estas rellenando un arraylist con valores de una clase estatica?

Cuando dices registros te refieres a propiedades o el return de algun método estatico?

Exacto.  Lo que pretendo es formar una lista (ArrayList) con unos elementos que tengan la estructura definida en la clase TAD.  Es decir, formar un ArrayList donde cada elemento de la lista tenga varias propiedades (4 numéricas y 1 de tipo matriz).

Cuando digo 'registros' me refiero a cada uno de los elementos del tipo TAD.  No sé si mi forma de llamarlo es la correcta.  Según lo que sé de otros lenguajes, uno define un tipo abstracto de datos del modo en que mejor se adecúa a sus necesidades.  Pues eso es lo que yo pretendía hacer definiendo la clase TAD (Tipo Abstracto de Datos), porque necesitaba 'registros', 'elementos' o el nombre que mejor sirva, formados por esos campos.

El problema está en que, al rellenar el ArrayList con esos elementos, en realidad todos los elementos son iguales, aunque me consta (lo he comprobado) que no es así.  Por eso creo que es cosa del 'static' de la clase.

No sé si te estoy aclarando lo que preguntabas...
#4
Java / Re: Duda general sobre 'static'
18 Enero 2013, 15:38 PM
Lo primero, muchas muchas gracias a los dos por tomaros la molestia de tratar de ayudarme.  

Respecto del código, no lo he puesto por dos motivos.  El primero es que son casi 400 líneas y (creo yo) desmoralizaría a cualquiera que quiera ayudar.  El segundo es que se trata de un trabajo para mi universidad y ni siquiera sé si puedo publicarlo sin infringir alguna norma y acabar suspendido.

Pero os copio/pego las partes que me parecen relevantes y si veis que necesitáis más información, pues me lo decís y hago los copia/pega que hagan falta.  ;D

Primero os pongo un esquema general de la estructura del programa:


La clase que definí (en otros lenguajes habría definido un tipo abstracto de datos, pero en Java... no sé si estoy haciendo lo correcto) está situada en el primer bloque, junto a las variables, y fue ésta:


static class TAD {

       int x, y, N, futuro;
       int matriz[][];
   }


Y el problema lo detecté al utilizar esa clase desde un método (desde uno de los bloques 'método n') para hacer un ArrayList formado por elementos de esa clase.  El código de ese método es éste:


static List<TAD> crearLista(TAD ensayo) {
       List<TAD> lista = new ArrayList<>();
       TAD test = new TAD();
       test.matriz = new int[tamañoMatriz][tamañoMatriz];
       copiarTAD(ensayo, test);
       for (int a = -2; a < 3; a++) {
           for (int b = -2; b < 3; b++) {
               if (((Math.abs(a)) + (Math.abs(b)) == 3)
                       && (ensayo.matriz[ensayo.x + a][ensayo.y + b] == 0)) {
                   test.x = ensayo.x + a;
                   test.y = ensayo.y + b;
                   test.N = ensayo.N + 1;
                   test.futuro = hacerListaDeEnteros(test);
                   lista.add(test);
               }
           }
       }
       return lista;
   }


Ese método lo llamo desde main con este código:


    lista1 = crearLista(ensayo);


Luego compruebo con lista1.size() que la lista tiene 2 elementos (eso está bien, es lo que esperaba) pero cuando compruebo los elementos veo que son iguales, y no deberían serlo.  

Y aquí me quedé atascado.  :-( No sé cómo seguir.  Si quito el valor static del tipo de datos que yo definí (TAD), entonces no puedo invocarlo desde los métodos o desde main.  Si no lo quito, el valor del contenido del registro es igual para todos los elementos de la lista 'lista1'.

Agradecería cualquier ayuda.  Un saludo.
#5
Java / Duda general sobre 'static'
18 Enero 2013, 11:23 AM
No sé ni cómo empezar a plantear esta duda.  Espero explicarme...

Estoy haciendo un programa y lo tengo bastante avanzado, ocupa casi 400 líneas.  El caso es que para ese programa definí una clase (llamémosla X) para poder crear registros que tuvieran varios campos, unos cuantos numéricos y otro de tipo matriz.

Pues bien, el problema me surge cuando intento hacer un ArrayList con distintos registros de esa clase X.  Esa lista la genera un método y ocurre que todos los elementos de esa lista son iguales, aunque no deberían serlo.

Según creo, eso ocurre porque definí la clase X como 'static' y, entonces, al generarse varios elementos de esa clase, se generan todos igual (si no es así, por favor corregidme).  Pero si elimino el 'static', entonces esa clase no puede ser usada por los métodos, ya que también son 'static'.  Y si elimino el 'static' de todos los métodos, entonces no pueden ser usadas por el programa main, que tiene que ser 'static' obligatoriamente.

No sé, estoy muy perdido con esto.  :-\  ¿Algún consejo?  Gracias de antemano.
#6
¡¡CONSEGUIDO!! :D

He insistido en sobreescribir el método compare() y finalmente lo conseguí.  Dejo el código por si sirviese a alguien:


import java.util.*;

public class Orden {

    static class Registro {

        String texto;
        int numero;
        int matriz[][] = new int[2][2];
    }

    public static void main(String[] args) {
        List<Registro> lista = new ArrayList<>();
        Registro registro01 = new Registro();
        Registro registro02 = new Registro();
        Registro registro03 = new Registro();
        Registro test = new Registro();

        // Doy valores al registro 01

        registro01.matriz[0][0] = 1;
        registro01.matriz[0][1] = 1;
        registro01.matriz[1][0] = 1;
        registro01.matriz[0][1] = 1;
        registro01.texto = "registro01";
        registro01.numero = 1;

        // Doy valores al registro 02

        registro02.matriz[0][0] = 2;
        registro02.matriz[0][0] = 2;
        registro02.matriz[0][0] = 2;
        registro02.matriz[0][0] = 2;
        registro02.texto = "registro02";
        registro02.numero = 2;

        // Doy valores al registro 03

        registro03.matriz[0][0] = 3;
        registro03.matriz[0][0] = 3;
        registro03.matriz[0][0] = 3;
        registro03.matriz[0][0] = 3;
        registro03.texto = "registro03";
        registro03.numero = 3;

        //Añado ambos elementos a la lista

        lista.add(registro03);
        lista.add(registro02);
        lista.add(registro01);
       
        test = lista.get(0);
        System.out.println("El primer registro es: " + test.texto);
        test = lista.get(1);
        System.out.println("El segundo registro es: " + test.texto);
        test = lista.get(2);
        System.out.println("El tercer registro es: " + test.texto);
        System.out.println();
        System.out.println("Ahora se procede a ordenar los registros");
        System.out.println();
        Collections.sort(lista, new ordenaRegistros());
        test = lista.get(0);
        System.out.println("El primer registro es: " + test.texto);
        test = lista.get(1);
        System.out.println("El segundo registro es: " + test.texto);
        test = lista.get(2);
        System.out.println("El tercer registro es: " + test.texto);
       
    }
}

class ordenaRegistros implements Comparator<Orden.Registro> {

    public int compare(Orden.Registro r1, Orden.Registro r2) {
        if (r1.numero < r2.numero) {
            return -1;
        } else if (r1.numero > r2.numero) {
            return 1;
        } else {
            return 0;
        }

    }
}


De nuevo, millones de gracias a quienes ayudan desinteresadamente a los principiantes como yo. :)
#7
Java / Re: Duda sobre el método get
16 Enero 2013, 23:49 PM
Esto de los modificadores de las variables me vuelve loco...  :rolleyes:

Muchas gracias [Case], de veras. ;-)
#8
Java / Duda sobre el método get
16 Enero 2013, 23:14 PM
No consigo que 'get' me devuelva el valor correcto.  Debe ser sencillo, pero no sé qué pasa y me está volviendo loco.

Éste es el código:


import java.util.*;

public class Orden {

    static class Registro {

        static String texto;
        static int numero;
        static int matriz[][] = new int[2][2];
    }

    public static void main(String[] args) {
        List<Registro> lista = new ArrayList<>();
        Registro registro01 = new Registro();
        Registro registro02 = new Registro();
        Registro registro03 = new Registro();
        Registro test = new Registro();

        // Doy valores al registro 01

        registro01.matriz[0][0] = 1;
        registro01.matriz[0][1] = 1;
        registro01.matriz[1][0] = 1;
        registro01.matriz[0][1] = 1;
        registro01.texto = "registro01";
        registro01.numero = 1;

        // Doy valores al registro 02

        registro02.matriz[0][0] = 2;
        registro02.matriz[0][0] = 2;
        registro02.matriz[0][0] = 2;
        registro02.matriz[0][0] = 2;
        registro02.texto = "registro02";
        registro02.numero = 2;

        // Doy valores al registro 03

        registro03.matriz[0][0] = 3;
        registro03.matriz[0][0] = 3;
        registro03.matriz[0][0] = 3;
        registro03.matriz[0][0] = 3;
        registro03.texto = "registro03";
        registro03.numero = 3;

        //Añado todos los elementos a la lista

        lista.add(registro01);
        lista.add(registro02);
        lista.add(registro03);
       
        test = lista.get(0);
        System.out.println("El primer registro es: " + test.texto);
        test = lista.get(1);
        System.out.println("El segundo registro es: " + test.texto);
        test = lista.get(2);
        System.out.println("El tercer registro es: " + test.texto);

    }
}


Pues la salida que produce es (para mi desesperación  :-() ésta:


El primer registro es: registro03
El segundo registro es: registro03
El tercer registro es: registro03


¿Alguna sugerencia? Muchas gracias de antemano.
#9
Hola a todos. :D

Agradecería mucho que alguien me dijera cómo se puede ordenar un ArrayList formado por registros de varios campos.  Es decir, si uno de esos campos es numérico, cómo se podría ordenar ese ArrayList para que los elementos estén ordenados de menor a mayor según ese campo numérico. 

Mi ejemplo:


import java.util.*;

public class Orden {
   
    static class Registro {
        static String texto;
        static int numero;
        static int matriz[][] = new int[2][2];
    }
   
    public static void main(String[] args) {
       
        List<Registro> lista = new ArrayList<>();
        Registro registro01 = new Registro();
        Registro registro02 = new Registro();

        // Doy valores al registro 01

        registro01.matriz[0][0] = 5;
        registro01.matriz[0][1] = 5;
        registro01.matriz[1][0] = 5;
        registro01.matriz[0][1] = 5;
        registro01.texto = "registro01";
        registro01.numero = 100;

        // Doy valores al registro 02

        registro02.matriz[0][0] = 1;
        registro02.matriz[0][0] = 1;
        registro02.matriz[0][0] = 1;
        registro02.matriz[0][0] = 1;
        registro02.texto = "registro02";
        registro02.numero = 1;     

        //Añado ambos elementos a la lista

        lista.add(0,registro01);
        lista.add(1,registro02);
    }
   
}


Haciéndolo así, el primer elemento del ArrayList sería 'registro01' y el segundo elemento sería 'registro02'.

Pues bien, la pregunta es ¿cómo se podrían ordenar de menor a mayor (según el campo registro.numero) los 2 registros que forman el ArrayList? ¿Existe algún método predefinido que lo haga?  ¿Y para ordenarlos según, por ejemplo, el valor del elemento (0,0) de las matrices? Yo no doy con ello...  :huh:

Muchas gracias de antemano y saludos.
#10
Al fin encontré una solución y la comparto aquí. 

Consiste en usar un bucle "for...each":


List<int[]> candidatos = new ArrayList<int[]>();
    candidatos.add(new int[]{3, 4, 5});
    candidatos.add(new int[]{23,2,1});
   
    for (int[] is : candidatos) {
for (int i = 0; i < is.length; i++) {
System.out.print(is[i]);
}
System.out.print("\n");
}