Il problema fondamentale è che i nomi dei file non sono costruiti nel modo corretto.
File20 verrà sempre prima di File3 (anche nel sistema operativo!!), perchè questo è l'ordinamento lessicografico delle stringhe.
Se i nomi dei file fossero scritto in modo "furbo" sarebbero così:
File01
File02
...
File10
File11
E sarebbero ordinabili lessicograficamente.
Per ordinarli nel modo "corretto" (umanamente parlando) hai un'unica strada: scrivere un metodo ad hoc per l'ordinamento.
Questo lo puoi fare sostanzialmente in due modi:
1) Scrivendo effettivamente il codice dell'algoritmo di ordinamento
2) Ingannando l'algoritmo normale, facendogli credere che l'oggetto che sta ordinando sia diverso da quello che realmente è.
Io ti consiglio la seconda strada: è un po' più facile e si scrive meno codice.
Per attuarla è sufficiente estendere la classe File facendo l'override del metodo compareTo() in modo da cercare di "uniformare" il nome del file. In questo caso potresti semplicemente prendere il nome del file, togliere di mezzo la parte iniziale (hai detto che si chiamano tutto "Filexx", quindi togliendo di mezzo la parte "File"), convertire in numero la seconda parte e restituire il valore di confronto fra quei numeri.
codice:
public int compareTo(Object o) {
File f = (File) o;
// I file si chiamano tutti "FileXX": tolgo la scritta "File" e ottengo il numero XX
String numeroThis = getName().substring(4, getName().length());
String numeroObj = o.getName().substring(4, o.getName().length());
int numThis = Integer.parseInt( numeroThis );
int numObj = Integer.parseInt( numeroObj );
return (numThis - numObj);
}
Lo stesso per il compareTo() che prende un oggetto File (non devi fare alcun cast all'inizio).
A questo punto puoi creare un array di oggetti della tua classe a partire dagli elementi di tipo File che hai nell'array e utilizzare Arrays.sort() per l'ordinamento.
Ciao.