2012-05-10 10 views
6

Ok, es ist das erste Mal, dass ich hier postiere, also ertragen Sie mit mir.Die Position von Elementen in einem Array in Java austauschen?

Ich habe einen Namen im Format "Smith, Bob I" und ich muss diese Zeichenfolge um "Bob I. Smith" lesen. Irgendwelche Ideen, wie man das macht?

Dies ist ein Weg, den ich ausprobiert habe, und obwohl es die Arbeit erledigt, sieht es ziemlich schlampig.

public static void main(String[] args) { 
     String s = "Smith, Bob I.", r = ""; 
     String[] names; 

     for(int i =0; i < s.length(); i++){ 
      if(s.indexOf(',') != -1){ 
       if(s.charAt(i) != ',') 
        r += s.charAt(i); 
      } 

     } 
     names = r.split(" "); 
     for(int i = 0; i < names.length; i++){ 
     } 
     System.out.println(names[1] +" " + names[2] + " " + names[0]); 


    } 
+1

+1 für die Mühe – Venki

+0

Ihr Algorithmus hängt wahrscheinlich ein bisschen auf, welche Art von Regeln über Eingabe Sie haben, wie diese zusätzliche Schritte erfordern Spezialfälle oder ermöglichen für verschiedene Verknüpfungen zu handhaben, da die Daten konsistent sind. ZB: Gibt es immer ein mittleres Anfangsgeschenk oder wird es manchmal keinen zweiten Vornamen oder einen vollen zweiten Vornamen geben? Was ist mit Titeln wie II oder Jr? Haben alle Namen eine erste UND letzte? Etc. –

+0

Okay, dies ist ein Werkzeug, das die Namen sammelt, wie sie aus unstrukturierten Texten stammen, oder sie werden durch das Scraping des Webs gesammelt. Sie kommen in allen Arten von Formaten, d. H. "Bob I. Smith", "Smith, Bob I", "Bob Smith", "Smith Bob". Ich muss einen Weg entwickeln, um alle Namen zu einem uniformierten Format zu machen, das vorerst entweder 'First M. Last' oder 'Last, First M' – Lambda

Antwort

10

Wenn der Name immer <last name>, <firstname> ist, versuchen Sie dies:

String name = "Smith, Bob I.".replaceAll("(.*),\\s+(.*)", "$2 $1"); 

wird Smith in Gruppe 1 und Bob I. in Gruppe 2, diese zu sammeln, die dann als $1 zugegriffen werden und $2 in der Ersatzzeichenfolge. Aufgrund der (.*) Gruppen im Ausdruck stimmt die gesamte Zeichenfolge überein und wird vollständig durch die Ersetzung ersetzt, bei der es sich nur um die zwei Gruppen handelt, die durch ein Leerzeichen ersetzt und getrennt werden.

+0

Alles in einer Zeile. Groß! –

+0

@userunknown so weit ich aus dem OP sagen kann, dass eine Voraussetzung ist: 'Smith, Bob I' ->' Bob I. Smith' - obwohl ich zugeben, dass ich den Punkt nicht hinzugefügt habe, da ich nicht sicher bin, ob das ist ein Tippfehler (im OP-Code ist der Punkt vorhanden) oder eigentlich eine Anforderung - sollte aber leicht hinzuzufügen sein. – Thomas

+0

@userunknown oder Sie haben einen Pixelfehler: 'I. + Pixelfehler könnte wie aussehen' I, ': P – Thomas

5
String[] names = "Smith, Bob I.".split("[, ]+"); 
    System.out.println(names[1] + " " + names[2] + " " + names[0]); 
4
final String[] s = "Smith, Bob I.".split(","); 
System.out.println(String.format("%s %s", s[1].trim(), s[0])); 
+0

Oder 'System.out.printf ("% s% s% n ", s [1] .trim(), s [0])); ' –

+1

@PaulVargas Sie müssen sich die println-Anweisung als Testcode ansehen, der echte Code ** würde ** diese Zeichenfolge zurückgeben. Sie haben in Ihrem Beispiel nichts zurückzugeben. –

3
String s = "Smith, Bob I."; 
String result = s.substring(s.indexOf(" ")).trim() + " " 
      + s.substring(0, s.indexOf(",")); 
+0

"Bob I.Smith" ist mein Ergebnis. Das Leerzeichen sieht fehl am Platz aus. –

+0

Immer noch eine leere Stelle vor Bob, für mich. –

+0

Ohh ... tut mir leid, im Moment ist es gut funktioniert. – isvforall

Verwandte Themen