# Straße und Hausnummer von String trennen



## dg87 (18. Juni 2013)

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


----------



## sheel (18. Juni 2013)

Wenns kein isnumeric gibt, mach dir doch selbst eins 


```
//(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.


----------



## Akeshihiro (18. Juni 2013)

Ä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.


----------



## youza (19. Juni 2013)

Kommt der String aus der Datenbank?
Wenn ja dann solltest du ganz wo anders Ansetzen:
http://de.wikipedia.org/wiki/Normalisierung_(Datenbank)#Erste_Normalform_.281NF.29

Wenn der String von deiner Gui kommt dann musst du deine Gui entsprchend anpassen also zwei Felder eins für Straßenname eins für Hausnummer ich hab noch nie verstanden das so viele des zeug immer zusammen mixen da kann nichts gescheites bei rauskommen.

Grüße
Youza


----------



## jimb0p (20. Juni 2013)

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.


```
array[array.length-1]
```

Somit hast du direkt die Hausnummer, wenn array die Teile des gesplitteten Strings enthält.


----------



## slowfly (20. Juni 2013)

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


----------



## Writtscher (20. Juni 2013)

```
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.


----------



## dg87 (20. Juni 2013)

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


----------



## slowfly (20. Juni 2013)

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


----------



## dg87 (20. Juni 2013)

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


----------



## Writtscher (20. Juni 2013)

"eigl fast nie sollte es vorkommen" 

Bei solchen Aussagen wirst man bei uns aus dem Fenster gehängt und für das letzte Prozent wird die Arbeit nicht abgenommen 

Aber gut, das man dir helfen konnte. 

Gruß


----------



## dg87 (20. Juni 2013)

Ja das weiß ich schon auch. Aber ich bau selbst eine Prüfung ein, wenn einer sowas wie Lindenstraße12 macht, dass ich es dann für street so übernehme.
Der Rest sollte ebenfalls abgedeckt sein - von daher


----------

