Java sortiert ein Array von Zeichenfolgen (gemischt mit Zahlen und Zeichen) [Duplikat]
Ich sortiere ein Array in Java, meine Eingaben sind {"a3", "a2", "a11", "b1", "b2", "b3", "c3", "c13", "c2"} und Ich möchte die Ausgabe {"a2", "a3", "a11", "b1", "b2", "b3", "c2", "c3", "c13"}
Was ich unten mache, ist, dass ich keine richtigen Ergebnisse zurückgebe. Vorschläge / Codebeispiele sind willkommen
import java.util.Arrays;
public class Main
{
public static void main(String[] args) {
String[] var = {"a3", "a2", "a11", "b1", "b2", "b3", "c3", "c13", "c2"};
Arrays.sort(var);
System.out.println(Arrays.toString(var));
}
}
Vom obigen Code erhalte ich eine Ausgabe [a11, a2, a3, b1, b2, b3, c13, c2, c3]
Antworten
Hier ist ein relativ einfacher Ansatz. Für so etwas würde ich jedoch eine Klasse erstellen, um die alphanumerischen Teile getrennt zu halten und einen Komparator zu schreiben. Wenn ich die Objekte drucke, hätte ich einfach toString()den ursprünglichen Wert zurückgegeben.
Das ist grundlegend. Es wird nicht nach fehlerhaften Zeichenfolgen gesucht.
String[] var = {"a3", "a2", "a11", "b1", "b2", "b3", "c3", "c13", "c2"};
Comparator<String> comp = (a,b)->{
// split the strings between the last char and the first digit
String[] v1 = a.split("(?<!\\d)(?=\\d)");
String[] v2 = b.split("(?<!\\d)(?=\\d)");
// convert each integer part to an int.
int n1 = Integer.valueOf(v1[1]);
int n2 = Integer.valueOf(v2[1]);
// compare each and get the result
int r1 = v1[0].compareTo(v2[0]);
int r2 = Integer.compare(n1,n2);
// first sort on r1 (the strings). If they are equal ( r1 == 0)
// then sort on the result of comparing the integers.
return r1 == 0 ? r2 : r1;
};
Array.sort benötigt keinen Komparator, daher müssen Sie das Array in eine Liste konvertieren und danach sortieren. Dies ändert auch das Array, da Objekt-Arrays die zurückgegebene Liste von sichern Arrays.asList.
Collections.sort(Arrays.asList(var),comp);
System.out.println(Arrays.toString(var));
Druckt
[a2, a3, a11, b1, b2, b3, c2, c3, c13]