2012-05-10 16 views
6

Ok, entonces es la primera vez que publico aquí, así que tengan paciencia conmigo.¿Intercambia la posición de los elementos dentro de una matriz en java?

Tengo un nombre en el formato de "Smith, Bob I" y necesito cambiar esta cadena para leer "Bob I. Smith". ¿Alguna idea sobre cómo hacer esto?

Esta es una forma en que lo he intentado, y aunque hace el trabajo, se ve bastante descuidado.

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 por el esfuerzo – Venki

+0

Su algoritmo probablemente dependerá un poco de qué tipo de reglas acerca de entrada que tiene, ya que esto puede requerir pasos adicionales para manejar casos especiales o permitan varios atajos porque los datos son consistentes. Por ejemplo: siempre hay un presente inicial en el centro o, a veces, no habrá un segundo nombre o un segundo nombre completo. ¿Qué pasa con títulos como II o Jr? ¿Todos los nombres tienen una primera Y última? Etc. –

+0

De acuerdo, esta es una herramienta que recopila los nombres, ya que provienen de textos no estructurados o se recogen raspando la web. Vienen en todo tipo de formatos, es decir, "Bob I. Smith", "Smith, Bob I", "Bob Smith", "Smith Bob". Necesito desarrollar una forma de convertir todos los nombres en un formato uniformado, que, por ahora, sea 'First M. Last' o 'Last, First M' – Lambda

Respuesta

10

Si el nombre es siempre <last name>, <firstname>, intente esto:

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

Este recogerá Smith en el grupo 1 y Bob I. en el grupo 2, los que se accede entonces como $1 y $2 en la cadena de reemplazo. Debido a los grupos (.*) en la expresión, toda la cadena coincide y será reemplazada completamente por la sustitución, que es solo los 2 grupos intercambiados y separados por un carácter de espacio.

+0

Todo en una línea. ¡Estupendo! –

+0

@userunknown por lo que puedo decir del OP que es un requisito: 'Smith, Bob I' ->' Bob I. Smith' - aunque admito que no agregué el punto, ya que no estoy seguro si eso es un error tipográfico (en el código del OP, el punto está presente) o en realidad un requisito, aunque debería ser fácil de agregar. – Thomas

+0

@userunknown o tiene un error de píxel: el error 'I.' + pixel podría verse como' 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

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

+1

@PaulVargas Debe mirar la instrucción println como código de prueba, el código real ** devolvería ** esa cadena. No tienes nada que devolver en tu ejemplo. –

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

"Bob I.Smith" es mi resultado. El blanco parece fuera de lugar. –

+0

Todavía un espacio en blanco delante de Bob, para mí. –

+0

Ohh ... lo siento, en este momento está bien funciona. – isvforall

Cuestiones relacionadas