Hola lcanciani. Es un poco lioso de entender al principio pero una vez se coge el "tranquillo" es facil de entender.
int i,j; Creamos dos variable para los bucles for
for(i = 0; i < matriz.length; i++) el for i se ejecutara mientras se menor que la longitud de la matriz
{
for(j = 0; j < i; j++) El for j se ejecuta mientras sea menor que i
Ahora viene la mama del corderito.
Si (matriz.compareToPersona(matriz[j],comparePor)>0 ( si es 1) entra en el bucle
if(matriz.compareToPersona(matriz[j],comparePor)>0){
buffer[0] = matriz[j]; Se copia el valor de matriz[j] en buffer[0]
matriz[j] = matriz[ i ]; Se copia el valor de matriz[ i ] en matriz[j]
matriz[ i ] = buffer[0];Se copia el valor de buffer[0] an matriz[ i ] y se hace el intercambio
del mayor con el menor
}
}
}
Te dejo el mismo código modificado para que veas el funcionamiento del intercambio.
Si cambias el operador > en el if "if(matriz.compareToPersona(matriz[j],comparePor)>0) por < se aprecia mejor el intercambio.
import java.util.*;
import java.util.Scanner;
/**
* Write a description of class TestCompareTo here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class TestCompareTo2
{
public static void main(String arg[]) {
Persona2[] persona=new Persona2[5];
//Variable para utilizar en el metodo de burja y en el comparador
//Seleccionamos la ordenacion por Edad o Altura
String comparePor;
persona[0] = new Persona2("Mario",187,22);
persona[1] = new Persona2("Pepe",176,52);
persona[2] = new Persona2("Manuel",158,27);
persona[3] = new Persona2("David",164,25);
persona[4] = new Persona2("Alberto",184,80);
System.out.println(" Array desordenado");
for(int i=0;i < persona.length;i++){
System.out.println(persona[ i ]);
}
comparePor="Altura";//Ordenar y comparar por altura
burbuja(persona,comparePor);
System.out.print ("\n\nArray Ordenado por altura de mas altura a menos altura\n");
for(int i=0;i < persona.length;i++){
System.out.println(persona[i]);
}
}// Fin del main
//*****************************************************
//Metodo de ordenacion por burbuja
public static void burbuja(Persona2[]matriz,String comparePor){
Persona2[] buffer=new Persona2[5];
String entradaTeclado;
int i,j;
System.out.println("Intercambio por altura");
Scanner entradaEscaner = new Scanner (System.in);
for(i = 0; i < matriz.length; i++)
{
for(j = 0; j < i; j++)
{
System.out.println("Antes de intercambio "+matriz[i].getAltura()+
" matriz j["+j+"]= "+matriz[j].getAltura());
//entradaTeclado = entradaEscaner.nextLine ();
if(matriz[i].compareToPersona(matriz[j],comparePor)<0){
buffer[0] = matriz[j];
matriz[j] = matriz[i];
matriz[i] = buffer[0];
}
System.out.print("Intercambio "+matriz[i].getNombre()+" "+ matriz[i].getAltura()+"\n"+
"Por "+matriz[j].getNombre()+" "+ matriz[j].getAltura()+"\n");
for(int z=0; z<matriz.length;z++){System.out.println(matriz[z]);}
}
entradaTeclado = entradaEscaner.nextLine ();
}
}//Fin metodo Burbuja
}//Fin de la Clase
public class Persona2 implements Comparable<Persona2>{
public String nombre;
public int edad, altura;
//Constructor
public Persona2( String nom,int al, int ed){
this.nombre=nom;
this.altura = al;
this.edad = ed;
}
//Metodos set
public String getNombre(){ return nombre;}
public int getAltura(){ return altura;}
public int getEdad(){ return edad;}
//Metodos get
public void setNombre(){ this.nombre=nombre;}
public void setAltura(){ this.altura=altura;}
public void setEdad(){ this.edad=edad ;}
public String toString(){
String msg="";
msg="Nombre:\t"+nombre+"\tAltura:\t "+altura+"\tedad: "+edad;
return msg;
}
@Override //Anulamos el error y creamos otro compareTo
// Asi evitamos crear un metodo para cada comparacion
public int compareTo(Persona2 o ) {
int resultado=0;
if (this.edad<o.edad) { resultado = 1; }// Cambio el valor de resultado para no crear otro metodo de ordenacion
else if (this.edad>o.edad) { resultado = -1; }
else { resultado = 0; }
return resultado;
}
//Comparar por edad y altura
//Se le pasa la variable cadena para ejecutar la comparacion por edad o por altura
public int compareToPersona(Persona2 o,String cadena ) {
int resultado=0;
if (cadena.equals("Edad")){
if (this.edad<o.edad) { resultado = 1; }// Cambio el valor de resultado para no crear otro metodo de ordenacion
else if (this.edad>o.edad) { resultado = -1; }
else { resultado = 0; }
}
if (cadena.equals("Altura")){
if (this.altura<o.altura) { resultado = -1; }
else if (this.altura>o.altura) { resultado = 1; }
else { resultado = 0; }
}
if (cadena.equals("Nombre")){
}
return resultado;
}
}
Espero que la respuesta te aclare las dudas.
Un saludo