import java.util.Comparator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Arrays;
class Archivo
{
{
this.nombre = nombre;
this.extension = extension;
}
// getters y setters
{
return nombre;
}
{
return extension;
}
{
return nombre + "." + extension;
}
}
class ArchivoComparadorCadena implements Comparator<Archivo>
{
private List<Comparator<Archivo>> listComparators;
@SafeVarargs
public ArchivoComparadorCadena(Comparator<Archivo>... comparators)
{
this.
listComparators = Arrays.
asList(comparators
); }
@Override
public int compare(Archivo nom1, Archivo nom2)
{
for (Comparator<Archivo> comparator : listComparators)
{
int result = comparator.compare(nom1, nom2);
if (result != 0)
{
return result;
}
}
return 0;
}
}
/**
* Este comparador compara dos archivos por su extensión.
* @author a.cedano
*
*/
class ExtensionComparator implements Comparator<Archivo>
{
@Override
public int compare(Archivo nom1, Archivo nom2)
{
return nom1.getExtension().compareTo(nom2.getExtension());
}
}
class NombreComparator implements Comparator<Archivo>
{
@Override
public int compare(Archivo nom1, Archivo nom2)
{
return nom1.getNombre().compareTo(nom2.getNombre());
}
}
/**
* Este programa demuestra cómo ordenar una colección
* por múltiples atributos usando un comparador encadenado.
*
* @author a.cedano
*
*/
class OrdenandoAtributosMultiples
{
public static void main
(String[] args
) {
List<Archivo> listArchivos = new ArrayList<Archivo>();
listArchivos.add(new Archivo("a", "txt"));
listArchivos.add(new Archivo("a", "pdf"));
listArchivos.add(new Archivo("z", "txt"));
listArchivos.add(new Archivo("aa1", "txt" ));
listArchivos.add(new Archivo("a1", "pdf" ));
listArchivos.add(new Archivo("", "htaccess" ));
listArchivos.add(new Archivo("extension con", " espacio" ));
listArchivos.add(new Archivo("", "sinnombre" ));
listArchivos.add(new Archivo("zzzz", "@!!" ));
listArchivos.add(new Archivo("sin extension", "" ));
System.
out.
println("*** Antes de ordenar: ***");
for (Archivo archivos : listArchivos)
{
}
// Aquí ordenamos primero por extensión, luego por nombre
Collections.
sort(listArchivos,
new ArchivoComparadorCadena
( new ExtensionComparator(),
new NombreComparator())
);
System.
out.
println("\n*** Después de ordenar: ***");
for (Archivo archivos : listArchivos)
{
}
}
}