Java - Ordenar una matriz de un objeto (clase) por una de sus variables.

   
Vista:

Ordenar una matriz de un objeto (clase) por una de sus variables.

Publicado por Andrés (4 intervenciones) el 30/03/2014 03:56:41
Hola.
Para un trabajo de la universidad, tengo que hacer un programa en el que tengo una clase profesor con la identificación, nombre, apellidos, edad, sexo, horas que labora y lo que gana por cada hora laborada (ese orden también lo lleva el constructor de la clase).
Luego, en la clase main, tengo que hacer una matriz de 3*3 la cual debo llenar con 9 profesores (objetos la clase) diferentes. La información de cada profesor es llenada desde la misma clase por medio del constructor. Finalmente, tengo que hacer una serie de métodos. En uno de estos métodos tengo que indicar el nombre del profesor con menor edad. La lógica que pretendía aplicar era ordenar la matriz de menor a mayor y, al final, imprimir el nombre del índice [0][0] de la matriz. He intentado ordenar la matriz utilizando el método burbuja para ordenar matrices de enteros, sin embargo, no he logrado hacer esto ni aplicar la lógica.
Les adjunto mi código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
public class Main {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner in = new Scanner(System.in);
 
        Profesor arreglo[][];
        arreglo = new Profesor[3][3];
 
        Profesor profe1 = new Profesor(126509404, "Edgar", "Hernandez", 29, "M", 8, 0);
        profe1.setValorHora(1.66);
        Profesor profe2 = new Profesor(233849920, "Nuria", "Ramírez", 52, "F", 4, 2.84);
        profe2.setValorHora(1.66);
        Profesor profe3 = new Profesor(126509404, "José", "Hernandez", 28, "M", 8, 1.66);
        profe3.setValorHora(1.66);
        Profesor profe4 = new Profesor(126509404, "Arlene", "Hernandez", 34, "M", 8, 1.66);
        profe4.setValorHora(1.66);
        Profesor profe5 = new Profesor(126509404, "Orlando", "Hernandez", 36, "M", 8, 1.66);
        profe5.setValorHora(1.66);
        Profesor profe6 = new Profesor(126509404, "Ximena", "Hernandez", 55, "M", 8, 1.66);
        profe6.setValorHora(1.66);
        Profesor profe7 = new Profesor(126509404, "Eduardo", "Hernandez", 44, "M", 8, 1.66);
        profe7.setValorHora(1.66);
        Profesor profe8 = new Profesor(126509404, "Johanna", "Hernandez", 35, "M", 8, 1.66);
        profe8.setValorHora(1.66);
        Profesor profe9 = new Profesor(126509404, "Gilberto", "Hernandez", 42, "M", 8, 1.66);
        profe9.setValorHora(1.66);
 
 
        arreglo[0][0] = profe1;
        arreglo[0][1] = profe2;
        arreglo[0][2] = profe3;
 
        arreglo[1][0] = profe4;
        arreglo[1][1] = profe5;
        arreglo[1][2] = profe6;
 
        arreglo[2][0] = profe7;
        arreglo[2][1] = profe8;
        arreglo[2][2] = profe9;
 
 
        profeMenorEdad(arreglo);
 
 
    }
//Aquí empieza el método para encontrar el profesor de menor edad.
public static void profeMenorEdad(Profesor matriz[][]) {
        for(int i = 0; i <matriz.length; i++){
            for(int j = 0; j < matriz.length; i++){
                for(int x = 0; x < matriz.length; j++){
                    for(int y = 0; y < matriz.length; y++){
                        if(matriz[i][j].getEdad() > matriz[x][y].getEdad()){
                            Profesor aux = matriz[i][j];
                            matriz[i][j] = matriz[x][y];
                            matriz[x][y] = aux;
                            System.out.println(aux.getNombre());
                        }
                    }
                }
            }
        }
    }

Muchas gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Borja

Ordenar una matriz de un objeto (clase) por una de sus variables.

Publicado por Borja (23 intervenciones) el 30/03/2014 21:28:45
Vale, entiendo el problema que tienes. Lo que no entiendo es porque quieres una matriz de 3x3 (supongo que restricciones del problema en cuestión que no vienen al caso).

Si lo que necesitas es sacar el nombre del profesor, sin más, yo no te recomendaría ordenar. Es mucho más sencillo de programas una búsqueda lineal. Y sobretodo sera más eficiente que eso que has hecho hay.

De primeras lo que veo es que los índices de los FOR no están bien, pues la X, por ejemplo nunca es sumada, con lo que te quedarías en un bucle infinito. Aparte de eso, comparas cada profesor con uno fijo (el [i,j]) el cual es sobrescrito por el profesor con el que se compara si este ultimo es más joven. Esto lo que te debe de dar es (creo, no lo estoy probando) una lista de profesores parcialmente menores, y por último el profesor más pequeño (aunque el profesor más pequeño puede salir muchas veces solo sabemos que es el menor cuando el programa haya acabado).
Para que solo sacara al profesor más joven, y ninguno más, deberías poner el println fuera de todos los FOR, y para ello tendrías que guardarte los índices del profesor más joven en cada momento..

Lo que haremos será lo siguiente: Escogeremos al primer profesor de la matriz como el profesor más joven (solo temporalmente), luego, miraremos para el resto de profesores. Cada vez que encontremos que un profesor es más joven que el que teniamos antes, lo guardamos.

El codigo sería este.


te dejo el enlace al codigo en pastebin por si quieres copiarlo directamente: http://pastebin.com/bQUucU9s


si lo que quieres es ordenar la matriz puedes hacer dos cosas. O bien usas un vector, en vez de una matriz, que es más fácil de ordenar (conceptualmente) o bien trabajas un poquito más para montarte un sistema con el que puedas decir esta matriz esta ordenada, ya que una matriz puede considerarse ordenada de más maneras que un vector (que solo tiene una dimensión).

si tienes tu array (no matriz) de profesores
Profesor pArray[] = {loquesea};
puedes incluir en la clase profesor la funcion public int compareTo(Profesor otro);
la cual compara this actual con otro, y la defines como tu quieres. Solo tienes que tener en cuenta que debe retornar un entero. 0 si son iguales, < 0 si otro es más grande, > 0 si lo es this.

luego solo tendrias que hacer: Arrays.sort(pArray);

Si prefieres mantener la matriz podrias hacer:
Professor pMatriz[][];
luego la rellenas, defines igualmente la funcion compareTo en la clase profesor y luego haces:

public class MiComparador implements Comparator<Cosa>
{
@Override
public int compare(Cosa p1, Cosa p2)
{
return cosaAComparar; //debe retornar un entero, -1 significa que p2 es mayor, 0 que son iguales.
}
}

donde Cosa puede ser Profesor[] y puede, por ejemplo restar las edades de los profesores en la posicion 0 de p1 y p2.
Si no tienes acceso a la clase profesor tambien pues implementar esta clase comparador Substituyendo Cosa por el tipo Profesor.

luego haces
Arrays.sort(pMatriz);

Y tendra en la prosicion [0][0] al más pequeño.

Bueno, esto es todo. No se si se entiende, espero que sí. Y si hay algún error es que no lo he probado en eclipse ni nada. Si hay algo pregunta aquí mismo otra vez
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ordenar una matriz de un objeto (clase) por una de sus variables.

Publicado por Andrés (4 intervenciones) el 30/03/2014 22:09:42
Muchas gracias por la respuesta. La voy a probar, y cualquier consulta te la hago por acá. Estoy usando una matriz, por que eso es lo que estamos estudiando en el curso en este momento y fueron los requerimientos del profesor, pero si estoy de acuerdo en que es más fácil con un arreglo o vector.
Para el trabajo igual tengo que ordenar la matriz, así que voy a investigar más la opción que me dijiste.
De nuevo, te lo agradezco mucho.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Borja

Ordenar una matriz de un objeto (clase) por una de sus variables.

Publicado por Borja (23 intervenciones) el 30/03/2014 23:55:13
Si me dices que lo estáis trabajando en el curso creo que con encontrar el valor te servirá, en los 4 años y medio de universidad (estudio ingeniería informática) nunca me he encontrado con tener que ordenar una matriz en forma de matriz, pero no está de más que investigues, así te equivocarás y aprenderás el doble.

Yo encantado de ayudar en lo que sea
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar