Hier ist eine Hilfsmethode, um die Arbeit zu erledigen.
Zunächst benötigen Sie eine neue Comparator-Oberfläche, da Comparator keine Grundelemente unterstützt:
public interface IntComparator{
public int compare(int a, int b);
}
(Sie könnten es natürlich mit Autoboxing / Unboxing machen, aber ich werde nicht dorthin gehen, das ist hässlich)
Hier ist eine Hilfsmethode zum Sortieren eines int-Arrays mit diesem Komparator:
public static void sort(final int[] data, final IntComparator comparator){
for(int i = 0; i < data.length + 0; i++){
for(int j = i; j > 0
&& comparator.compare(data[j - 1], data[j]) > 0; j--){
final int b = j - 1;
final int t = data[j];
data[j] = data[b];
data[b] = t;
}
}
}
Und hier ist ein Client-Code. Ein dummer Komparator, der alle Zahlen sortiert, die nur aus der Ziffer '9' nach vorne bestehen (wieder nach Größe sortiert) und dann den Rest (was auch immer gut ist):
final int[] data =
{ 4343, 544, 433, 99, 44934343, 9999, 32, 999, 9, 292, 65 };
sort(data, new IntComparator(){
@Override
public int compare(final int a, final int b){
final boolean onlyNinesA = this.onlyNines(a);
final boolean onlyNinesB = this.onlyNines(b);
if(onlyNinesA && !onlyNinesB){
return -1;
}
if(onlyNinesB && !onlyNinesA){
return 1;
}
return Integer.valueOf(a).compareTo(Integer.valueOf(b));
}
private boolean onlyNines(final int candidate){
final String str = String.valueOf(candidate);
boolean nines = true;
for(int i = 0; i < str.length(); i++){
if(!(str.charAt(i) == '9')){
nines = false;
break;
}
}
return nines;
}
});
System.out.println(Arrays.toString(data));
Ausgabe:
[9, 99, 999, 9999, 32, 65, 292, 433, 544, 4343, 44934343]
Der Sortiercode wurde aus Arrays.sort (int []) übernommen , und ich habe nur die Version verwendet, die für kleine Arrays optimiert ist. Für eine echte Implementierung sollten Sie sich wahrscheinlich den Quellcode der internen Methode sort1(int[], offset, length)
in der Arrays- Klasse ansehen .