fork(1) download
  1. import java.util.Comparator;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;
  5. import java.util.Arrays;
  6.  
  7. class Archivo
  8. {
  9. private String nombre;
  10. private String extension;
  11.  
  12. public Archivo (String nombre, String extension)
  13. {
  14. this.nombre = nombre;
  15. this.extension = extension;
  16. }
  17.  
  18. // getters y setters
  19. public String getNombre()
  20. {
  21. return nombre;
  22. }
  23.  
  24. public String getExtension()
  25. {
  26. return extension;
  27. }
  28.  
  29.  
  30. public String toString()
  31. {
  32. return nombre + "." + extension;
  33. }
  34. }
  35.  
  36.  
  37. class ArchivoComparadorCadena implements Comparator<Archivo>
  38. {
  39.  
  40. private List<Comparator<Archivo>> listComparators;
  41.  
  42. @SafeVarargs
  43. public ArchivoComparadorCadena(Comparator<Archivo>... comparators)
  44. {
  45. this.listComparators = Arrays.asList(comparators);
  46. }
  47.  
  48. @Override
  49. public int compare(Archivo nom1, Archivo nom2)
  50. {
  51. for (Comparator<Archivo> comparator : listComparators)
  52. {
  53. int result = comparator.compare(nom1, nom2);
  54. if (result != 0)
  55. {
  56. return result;
  57. }
  58. }
  59. return 0;
  60. }
  61. }
  62.  
  63.  
  64. /**
  65.  * Este comparador compara dos archivos por su extensión.
  66.  * @author a.cedano
  67.  *
  68.  */
  69. class ExtensionComparator implements Comparator<Archivo>
  70. {
  71.  
  72. @Override
  73. public int compare(Archivo nom1, Archivo nom2)
  74. {
  75. return nom1.getExtension().compareTo(nom2.getExtension());
  76. }
  77. }
  78.  
  79.  
  80. class NombreComparator implements Comparator<Archivo>
  81. {
  82.  
  83. @Override
  84. public int compare(Archivo nom1, Archivo nom2)
  85. {
  86. return nom1.getNombre().compareTo(nom2.getNombre());
  87. }
  88. }
  89.  
  90.  
  91. /**
  92.  * Este programa demuestra cómo ordenar una colección
  93.  * por múltiples atributos usando un comparador encadenado.
  94.  *
  95.  * @author a.cedano
  96.  *
  97.  */
  98. class OrdenandoAtributosMultiples
  99. {
  100.  
  101. public static void main(String[] args)
  102. {
  103. List<Archivo> listArchivos = new ArrayList<Archivo>();
  104. listArchivos.add(new Archivo("a", "txt"));
  105. listArchivos.add(new Archivo("a", "pdf"));
  106. listArchivos.add(new Archivo("z", "txt"));
  107. listArchivos.add(new Archivo("aa1", "txt" ));
  108. listArchivos.add(new Archivo("a1", "pdf" ));
  109. listArchivos.add(new Archivo("", "htaccess" ));
  110. listArchivos.add(new Archivo("extension con", " espacio" ));
  111. listArchivos.add(new Archivo("", "sinnombre" ));
  112. listArchivos.add(new Archivo("zzzz", "@!!" ));
  113. listArchivos.add(new Archivo("sin extension", "" ));
  114.  
  115.  
  116. System.out.println("*** Antes de ordenar: ***");
  117.  
  118. for (Archivo archivos : listArchivos)
  119. {
  120. System.out.println(archivos);
  121. }
  122.  
  123. // Aquí ordenamos primero por extensión, luego por nombre
  124.  
  125. Collections.sort(listArchivos, new ArchivoComparadorCadena(
  126. new ExtensionComparator(),
  127. new NombreComparator())
  128. );
  129.  
  130. System.out.println("\n*** Después de ordenar: ***");
  131.  
  132. for (Archivo archivos : listArchivos)
  133. {
  134. System.out.println(archivos);
  135. }
  136.  
  137. }
  138. }
Success #stdin #stdout 0.04s 4386816KB
stdin
Standard input is empty
stdout
*** Antes de ordenar: ***
a.txt
a.pdf
z.txt
aa1.txt
a1.pdf
.htaccess
extension con. espacio
.sinnombre
zzzz.@!!
sin extension.

*** Después de ordenar: ***
sin extension.
extension con. espacio
zzzz.@!!
.htaccess
a.pdf
a1.pdf
.sinnombre
a.txt
aa1.txt
z.txt