Ti posto un esempio: la seguente classe (che probabilmente può essere ottimizzata) rappresenta una stringa che verrà sempre ordinata (rispetto ad altri oggetti dello stesso tipo) secondo l'algoritmo che interessa a te, ovvero con le lettere prima delle cifre:
codice:
public class MiaStringa implements Comparable {
private String str;
public MiaStringa(String str) { this.str = str; }
public String toString() { return str; }
public int compareTo(Object obj) {
int retVal = 0;
MiaStringa ms = (MiaStringa) obj;
char[] str1 = str.toCharArray();
char[] str2 = ms.toString().toCharArray();
// Controllo subito i casi base
if (str1.length == 0) {
// In questo caso this è la stringa vuota.
// Questo oggetto può essere solo minore o
// al massimo uguale a quello passato
retVal = (str2.length > 0) ? -1 : 0;
} else {
if (str2.length == 0) {
// L'oggetto passato è la stringa vuota.
// Questo oggetto è ovviamente maggiore
retVal = 1;
} else {
for(int i=0; i<str1.length; i++) {
if (i < str2.length) {
if ( Character.isDigit(str1[i]) ) {
if ( Character.isDigit(str2[i]) ) {
retVal = (str1[i] - str2[i]);
if (retVal != 0) break;
} else {
retVal = 1;
break;
}
} else {
if ( Character.isDigit(str2[i]) ) {
retVal = -1;
break;
} else {
retVal = (str1[i] - str2[i]);
if (retVal != 0) break;
}
}
} else {
// L'oggetto passato è un "left()" di questo.
retVal = 1;
break;
}
}
}
}
return retVal;
}
}
Questo semplice esempio dimostra quanto appena detto:
codice:
import java.util.*;
public class Ordina {
public static void main(String[] args) {
MiaStringa[] ms = generaRandom( 10 );
Arrays.sort( ms );
for(int i=0; i<10; i++) {
System.out.println( ms[i] );
}
}
private static MiaStringa[] generaRandom(int quanti) {
MiaStringa[] ret = new MiaStringa[quanti];
for(int i=0; i<quanti; i++) {
String valore = generStr();
ret[i] = new MiaStringa( valore );
}
return ret;
}
private static String generStr() {
String ret = "";
int rand = (int) (Integer.MAX_VALUE * Math.random());
ret = Integer.toHexString( rand );
return ret;
}
}
L'esempio d'uso genera un array di 10 oggetti MiaStringa. Ciascun oggetto viene generato casualmente (viene preso un intero a caso fra 0 e MAX_VALUE e convertito in esadecimale), quindi l'intero array viene ordinato tramite il metodo sort() della classe Arrays (che usa, per l'appunto, oggetti Comparable).
La specifica dell'ordinamento è di imporre che ciascun carattere alfabetico venga prima di qualunque cifra. Il confronto fra cifre e il confronto fra caratteri alfabetici, segue l'ordinamento classico.
Ciao.