2012-04-25 6 views
5

Tengo un código para ordenar las rutas por fecha de modificación. También quiero escribir algún código para ordenar las rutas en orden inverso, y luego podría querer agregar algunos otros métodos de clasificación. ¿Hay alguna forma de hacer todo el ordenamiento desde un único archivo de clase? O tengo que crear otra clase PathSortByDateReverse, PathSortByCreated, PathSortByFoo, etc. Además, ¿cómo usaría los diferentes métodos de clasificación?Implementando el comparador varias veces en un solo archivo de clase

import java.nio.file.Path; 
import java.util.Comparator; 

public class PathSortByDate implements Comparator<Path> { 

@Override 
public int compare(Path first, Path second) { 
    long seconddate = second.toFile().lastModified(); // get just the filename 
    long firstdate = first.toFile().lastModified(); 

    if (firstdate == seconddate) { 
     return 0; 
    } else if (firstdate > seconddate) { 
     return 1; 
    } else { 
     return -1; 
    } 
} 
} 

entonces yo lo llamo desde el otro clase con:

public static ArrayList<Path> sortArrayListByDate(ArrayList<Path> pathlist) { 
    Collections.sort(pathlist,new PathSortByDate()); 
    return pathlist; 
}  

Respuesta

1

usted no necesita hacer el comparador inversa, sólo lo hacen y revertir con

Collections.reverseOrder() 
+0

Gracias, pensé en eso, pero probablemente quiera agregar otros métodos de clasificación más adelante, y básicamente quiero entender mejor cómo funciona todo. – localhost

3

Por qué no ir para una clase interna anónima?

public static final Comparator<Person> ID_DESC 
    = new Comparator<Person>() { 
     public int compare(Person p1, Person p2) { 
     return -1 * p1.getId().comparedTo(p2.getId()); 
     // reversed order 
     } 
    }; 
+0

Puede obtener más información [aquí] (http://stackoverflow.com/questions/10309929/implementing-comparator-multiple-times-in-a-single-class-file/10310033#10310033) –

2

Normalmente lo haría así. Aviso, el constructor es "privado" y hay un "método de fábrica público" para obtener una instancia. Siempre existirán dos instancias de PathComparator en cualquier punto dado. Este es un gran negocio si desea optimizar su código y utilizar las mejores prácticas.

import java.nio.file.Path; 
import java.util.Comparator; 

final public class PathComparator implements Comparator<Path> { 

// comparator for in order 
final private static PathComparator ascendingOrderComparatorDate = new PathComparator(true); 
// comparator for reverse order 
final private static PathComparator descendingOrderComparatorDate = new PathComparator(false); 

final private int isAscendingOrderInt; 

final public PathComparator getPathComparator(boolean isAscendingOrder) { 
    return isAscendingOrder ? ascendingOrderComparatorDate : descendingOrderComparatorDate; 
} 

private PathComparator(boolean isAscendingOrder) { 
    this.isAscendingOrderInt = isAscendingOrder ? 1 : -1; 
} 

@Override 
public int compare(Path first, Path second) { 
    // for optimization (not required but highly recommended) 
    if(first == second) return 0; 

    long seconddate = second.toFile().lastModified(); // get just the filename 
    long firstdate = first.toFile().lastModified(); 

    if (firstdate == seconddate) { 
     return 0; 
    } else if (firstdate > seconddate) { 
     return isAscendingOrderInt * 1; 
    } else { 
     return isAscendingOrderInt * -1; 
    } 
}} 
Cuestiones relacionadas