2012-04-25 7 views
5

Ho un codice per ordinare i percorsi per data modificata. Voglio anche scrivere del codice per ordinare i percorsi in ordine inverso, e in seguito vorrei aggiungere altri metodi di ordinamento. C'è un modo per fare tutto l'ordinamento da un singolo file di classe? O devo creare un'altra classe PathSortByDateReverse, PathSortByCreated, PathSortByFoo, ecc. Inoltre, come utilizzerei i diversi metodi di ordinamento?Implementazione del comparatore più volte in un singolo file di classe

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; 
    } 
} 
} 

Ho poi chiamo dall'altra classe con:

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

risposta

1

non avete bisogno di fare il confronto inverso, basta farlo e invertire con

Collections.reverseOrder() 
+0

Grazie, ci ho pensato, ma probabilmente voglio aggiungere altri metodi di ordinamento in seguito, e in sostanza voglio capire meglio come funziona. – localhost

3

Perché non andare per un anonimo classi interne?

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

È possibile ottenere maggiori informazioni [qui] (http://stackoverflow.com/questions/10309929/implementing-comparator-multiple-times-in-a-single-class-file/10310033#10310033) –

2

Normalmente lo farei in questo modo. Si noti, il costruttore è "privato" e c'è un "metodo di fabbrica pubblico" per ottenere un'istanza. Ci saranno mai due istanze di PathComparator in un dato punto. Questo è un grosso problema se vuoi ottimizzare il tuo codice e utilizzare le migliori pratiche.

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; 
    } 
}} 
Problemi correlati