Straße und Hausnummer von String trennen

dg87

Erfahrenes Mitglied
Joa jetzt hab ich wieder nen Problem.
zwar hab ich einen String, in der Straße und Hausnummer drinnen steht. Jetzt wollte ich das über ein Leerzeichen splitten (kann ja auch Jürgen Herold von Damm Straße 18) heißen und halt mit einer Schleife dann das Array durchgehen.
Jetzt stoße ich auf die nicht so dolle Eigenschaft, dass Java ja gar kein String.isnumeric() oder sowas kann, sondern nur via Try-Catch Verfahren (durch parsen) oder durch reguläre Ausdrücke zu machen.

Damit ich es als Laie hinbringe, würde ich wohl auf das Try Catch Verfahren mit Parseint zurückgreifen, aber das ist doch nicht schön und sauber programmiert, vor allem bricht er dann doch via Exception den weiteren Verlauf des programms ab?

Wie macht man das am besten via reguläre Ausdrücke, habe zwar ein paar Beispiele im Internet angesehen aber verstehe das nicht so ganz bzw finde keinen Ansatz. Ich würde mich auf eine Hilfestellung mit Erklärung freuen - keinen Google Link oder so:)
 
Wenns kein isnumeric gibt, mach dir doch selbst eins :)

Code:
//(Halb-Pseudocode)
boolean isnumeric(String s) {
    try {
        //s parsen
    } catch {
         return false;
    }
    return true;
}
Klar gehts schöner, aber das ist zumindest einfach zu verwenden.

PS: Bzw. in Java gehts nicht wirklich schöner, weil man um Exceptionerzeugung kaum rumkommt.
Nur, ob man so eine abgekapselte Methode verwendet und nach dem Returnwert entscheidet
oder direkt im eigentlichen Code try-catch einbau, über das kann man sich streiten.
 
Ähm.. Wenn du try-catch verwendest, wieso sollte dann die Anwendung abbrechen? Deswegen "versucht" man es ja und wenn es einen Fehler gibt, dann fängt man diesen ab, sprich in dem Fall wird dann NumberFormatException abgefangen.

Ob das Versuchen eines Strings in eine Zahl zu parsen sauber oder unsauber ist bzw. in dem Fall, darüber kann man sich streiten, was anderes übrig bleiben wird dir aber in jedem Fall nicht. Denn selbst wenn du das mit RegEx machst, so hast du die Hausnummer immer noch nur als String und müsstest diesen dann dennoch in eine Zahl parsen. Das heißt, wenn wir davon ausgehen, dass die Hausnummern nur aus Zahlen bestehen, was in der Realität nicht der Fall ist, denn oft hat man noch Buchstaben wie a, b und c dran, dann musst du das sowieso als String ablegen.
 
Du kannst es so machen wie du vorgehabt hast. Dann hol dir einfach den letzten Eintrag vom Array da die Hausnummer immer als letztes kommt. Dann ist egal wie häufig vorher durch ein Leerzeichen getrennt wurde.

Code:
array[array.length-1]

Somit hast du direkt die Hausnummer, wenn array die Teile des gesplitteten Strings enthält.
 
Ich bin auch der Meinung, dass die try/catch-Variante eigentlich unschön ist. Aber man kann ja mal den Integer.parseInt()-Code anschauen bzw. die Methode in "isInt" umbenennen und die "throws" mit "return false"'s ersetzen... aber da kommt man zum Schluss, dass man doch einfach nen try/catch-Block schreibt ;-)

Gruss
slowy
 
Code:
public static void main(String[] args) {
        String deinString = "Jürgen Herold von Damm Straße 18";
        char[] deinStringAsCharArray = deinString.toCharArray();

        int positionWoerter = 0;
        int positionZahlen = 0;
        Map<Integer, String> woerter = new HashMap<>();
        Map<Integer, Integer> zahlen = new HashMap<>();


        for (char c : deinStringAsCharArray) {
            if (Character.isWhitespace(c)) {
                positionWörter++;
            }

            String charaterAsString = String.valueOf(c);
            if (Character.isAlphabetic(c)) {
                String firstString = woerter.get(positionWörter);
                if (firstString != null) {
                    woerter.put(positionWörter, firstString + charaterAsString);
                } else {
                    woerter.put(positionWörter, charaterAsString);
                }
            }

            if (Character.isDigit(c)) {
                positionZahlen++;
                zahlen.put(positionZahlen, Integer.valueOf(charaterAsString));
            }
        }

        for (String wort : woerter.values()) {
            System.out.println(wort);
        }

        for (Integer zahl : zahlen.values()) {
            System.out.println(zahl);
        }
    }

Ergebnis:

Jürgen
Herold
von
Damm
Straße
1
8

Edit:

Ist nicht perfekt aber ist ein Anfang. Damit kann man arbeiten denke ich.
 
Zuletzt bearbeitet:
Zunächst einmal vielen Dank, großartig wie man hier geholfen wird von euch.
Aber eigentlich ist doch das einfachste dann, ich prüfe auf das letzte Element im Array, von daher hab ich dann immer die Hausnummer :)

LG

edit:
Nein kommt von einer externen XML Datei. DIe Lösungen sind allesamt Interessant auf jeden Fall, aber klar das mit dem letzten Array Element finde ich in diesem Beispiel am besten
 
Mir fallen da noch zwei Fälle ein, die berücksichtigt werden müssen:
1. Strasse 17b zum Beispiel. Ich weiss nicht wie das in D ist, aber in CH kommt das öfters vor, wenn da Häuser zwischen anderen Häuser "reingequetscht" werden.
2. Gibt es Adressen ohne Nummern

Gruss,
slowy
 
Das ist richtig, habe ich auch schon gedacht.
Da allerdings Housnumber ohnehin als Varchar bei mir in der DB sitzt, passt das mit dem letzten Element ganz gut. Normal oder eigl fast nie sollte es vorkommen, dass zB
Lindenstraße 43 45 ist, wenn dann Lindenstraße 43-45
oder Lindenstraße 34b

Von daher nehm ich einfach das letzte Element, das sollte zu 99 Prozent greifen.

LG
 
Zurück