compareTo, Comparable (implements), ordenar array?

Sheila
24 de Abril del 2005
hola a todos.
tengo la siguien clase media es la description de un film con los campos Nombre del film, tamaño,
Rating, disponible en internet(internet), y un path.

lo que quiero ordenar en un Jlist por campos
utilisando varios botones :
1- Ordenar por nombre
2-ordenar por tamaño
3-ordenar por Rating
En una segunda clase creo un array de elementos
Media y en el voy a desarrollar los algorithmos de
ordenación (burbuja, fusión, inserción e ======> implementar
los métodos de ordenacion que java ofrece es aqui mi problema!!!!)

me han aconsejado (nuestro profesor) de redefinir compareTo para utilisar l\'interface Comparable (implements) pero estoy realmente perdida a mitad del camino alguien podria ayudarme por favor
cualquier información sera muy agradecida.

import java.lang.String;
import java.text.DecimalFormat;

public class Media
{
public final static String Archivo_DEFAUT = "EN CONSTRUCTION";
public final static int LONG_NOM_ARCHIVO_MIN = 1;
public final static int LONG_NOM_ARCHIVO_MAX = 256;
public final static int LONG_NOM_ARCHIVO_AFF_MAX = 30;
public final static char[] CARACTERES_PROHIBIDOS =
{\'\\\', \'/\', \':\', \'*\', \'?\', \'"\', \'<\', \'>\', \'|\'};
public final static int TAMANO_DEFAUT = 0;
public final static int TAMANO_MIN = 0;
public final static int TAMANO_MAX = 104857600;
public final static int RATING_DEFAUT = 0;
public final static int RATING_MEDIOCRE = 1;
public final static int RATING_MOYEN = 2;
public final static int RATING_buen = 3;

public final static String PATH_DEFAUT = "c:/temp";
public final static int LONG_PATH_MIN = 5;
public final static int LONG_PATH_MAX = 5140;

//atributos de la clase Media
private String nomARCHIVO;
private int TAMANOARCHIVO;
private int RATING;
private boolean internet;
private String path;

public Media()
{
nomARCHIVO = ARCHIVO_DEFAUT;
TAMANOARCHIVO = TAMANO_DEFAUT;
RATING = RATING_DEFAUT;
internet = false;
path = PATH_DEFAUT;
}


public Media( String paramNomARCHIVO,
int paramTAMANOARCHIVO,
int paramRATING,
boolean paramInternet,
String paramPath) throws Exception
{
String mensageErreur="";
boolean buenNom=setNomARCHIVO(paramNomARCHIVO);
boolean buenTAMANOFichie=setTAMANOARCHIVO(paramTAMANOARCHIVO);
boolean buenParamRATING=setRATING(paramRATING);
boolean buenPath=setPath(paramPath);

if (!buenNom) mensageErreur+="mal nombre de Archive \n";
if (!buenTAMANOFichie) mensageErreur+="mal TAMANO de Archive \n";
if (!buenParamRATING) mensageErreur+="RATING invalide \n";
if (!buenPath) mensageErreur+="mal path \n";

if (!(buenNom && buenTAMANOFichie && buenParamRATING && buenPath))
throw new Exception (mensageErreur);
}

public String getPath()
{ return path; }


public boolean getInternet()
{ return internet; }


public String getNomARCHIVO()
{
return nomARCHIVO;
}

public int getTAMANOARCHIVO()
{
return TAMANOARCHIVO;
}

public int getRATING()
{
return RATING;
}

/
public void setInternet(boolean paramInternet) {
internet=paramInternet;
}


public boolean setPath(String paramPath)
{
boolean buenPath;
buenPath=validerPath(paramPath);
if (buenPath) path=paramPath;
return buenPath;
}

public boolean setNomARCHIVO(String paramNomARCHIVO)
{
boolean buenNomDeARCHIVO;
buenNomDeARCHIVO=validerNomARCHIVO(paramNomARCHIVO);
if (buenNomDeARCHIVO) nomARCHIVO=paramNomARCHIVO;
return buenNomDeARCHIVO;
}

public boolean setTAMANOARCHIVO(int paramTAMANOARCHIVO)
{
boolean buenTAMANO;
buenTAMANO=validerTAMANOARCHIVO(paramTAMANOARCHIVO);
if (buenTAMANO) TAMANOARCHIVO=paramTAMANOARCHIVO;
return buenTAMANO;
}

public boolean setRATING(int paramRATING)
{
boolean buenRATING;
buenRATING=validerRATING(paramRATING);
if (buenRATING) RATING=paramRATING;
return buenRATING;
}

private boolean validerPath(String paramPath)
{
boolean valide=true;
for (int i=0;i<paramPath.length()&&valide==true;i++)
{
for (int j=3;j<CARACTERES_INTERDITS.length && valide==true;j++)
{ valide=(!(paramPath.charAt(i)==CARACTERES_INTERDITS[j]));}
}
return valide;
}

private boolean validerNomARCHIVO(String paramNomARCHIVO)
{
boolean valide=true;
for (int i=0;i<paramNomARCHIVO.length()&&valide==true;i++)
{
for (int j=0;j<CARACTERES_PROHIBIDOS.length && valide==true;j++)
{ valide=(!(paramNomARCHIVO.charAt(i)==CARACTERES_PROHIBIDOS[j]));}
}
return valide;
}

private boolean validerTAMANOARCHIVO(int paramTAMANOARCHIVO)
{
return paramTAMANOARCHIVO >= TAMANO_MIN &&
paramTAMANOARCHIVO <= TAMANO_MAX;
}

private boolean validerRATING(int paramRATING)
{
return paramRATING >= RATING_DEFAUT &&
paramRATING <= RATING_buen;
}

public String toString()
{
DecimalFormat dd = new DecimalFormat("#0.00");
String cadena = "";

cadena += nomARCHIVO;

for (int i = nomARCHIVO.length() ; i < LONG_NOM_ARCHIVO_AFF_MAX ; i++)
{
cadena += " ";
}

cadena += " ";

if(TAMANOARCHIVO/(1024*1024) < 10)
{
cadena += " ";
}

cadena += dd.format(TAMANOARCHIVO/(1024*1024)) + " Mo " + RATING;

if (internet)
{
cadena += " " + "OUI";
}
else
{
cadena += " " + "NON";
}

return cadena;
}

public int compare(String paramTitre)
{ return this.nomARCHIVO.compareTo(paramTitre);}


public int compare(int paramTAMANO)
{
int valeur;
if (this.TAMANOARCHIVO>paramTAMANO){valeur=1;}
else if (this.TAMANOARCHIVO<paramTAMANO) valeur=-1;
else valeur=0;
return valeur;
}

public int compare(byte paramRATING)
{
int valeur;
if (this.RATING>paramRATING){valeur=1;}
else if (this.RATING<paramRATING) valeur=-1;
else valeur=0;
return valeur;
}

public int compareTo(Object obj)
{
Media objectACompare=(Media) obj;
return this.nomARCHIVO.compareTo(objectACompare.getNomARCHIVO());
}
}

nicokiki
24 de Abril del 2005
Hola!!!!!!!!

Si vos queres usar los metodos q te provee JAVA para ordenar => tenes distintas formas de hacerlo (creo q son dos, al menos yo concozco dos). Uno es implementar Comparable (como te dijeron) y la otra es con Comparator. Siempre use la q te dijeron q uses. La idea es simple. Como vos vas a meter tus objetos (instancias de Media) en un ArrayList o algo de las Collection => como querras ordernar, JAVA no es magico, sino q le tenes q decir vos como comparar los objetos. Bueno, es por eso q implementas la interfaz Comparable entonces sabra con q criterio ordenar.
Ahora, cabe aclarar q vos tenes q escribir compareTo(java.lang.Object obj) {} pero lo q no podes hacer es ordenar una vez por un atributo de Media, despues por otro y asi, sino q queda fijo. En ese caso creo q sirve mas lo de Comparator, ya q a la Collection le mandas el ArrayList y el Comparator y depende el caso le mandas uno u otro. Bueno, sigo con lo de Comparable:
public class Media implements Comparable {

....

prublic int compareTo(Object obj){
Media o = (Media)obj;
return this.nomArchivo.compareTo(o.getNomArchivo());
// Acostumbrate a escribir en Java Conding Style!! y no
// escribas esto: nomARCHIVO (MAL!!!), escribi:
// nomArchivo (BIEN"!!!)
}

}

Espero q haya servido de algo

Salu2!!!!!!!!!!!

P.D.: Si queres ver como usar el Comparator cambiandolo en Runtime, mira los fuentes de la libreria de struts de los tipos q inventaron <LAYOUT:COLLECTION/>. Si buscas por eso en google llegas a su sitio y de ahi a los fuentes