2013-04-18 6 views
5

zB:Capitalize erste Wort eines Satzes in einem String mit mehreren Sätzen

String s = "Dies ist a.line ist .over"

als

kommen sollte

„Dies ist ein .line is.Over“

ich dachte Kette mit tokenizer zweimal

-first split using"." 

-second split using " " to get the first word 

-then change charAt[0].toUpper 

jetzt bin ich nicht t sicher, wie die Ausgabe von Zeichenfolge Tokenizer als Eingabe für eine andere verwenden?

auch ich kann die Split-Methode i

 String a="this is.a good boy"; 
    String [] dot=a.split("\\."); 

     while(i<dot.length) 
    { 
     String [] sp=dot[i].split(" "); 
      sp[0].charAt(0).toUpperCase();// what to do with this part? 
+0

Sie brauchen nicht t Der zweite Split wird gemacht, um charAt [0] .toUpper() zu machen, ein Trim ist genug. – Pino

+0

Sehen Sie dies früher [Antwort] (http://stackoverflow.com/questions/1892765/capitalize-first-char-of-each-word-in-a-string-java) – GrahamA

+0

@ Bhaskar-die Frage ist ein wenig anders hier habe ich eine Zeichenfolge mit mehreren Sätzen, also zuerst möchte ich die Sätze aufteilen und dann das Wort groß schreiben .. meine Verwirrung geht darum, wie man zum zweiten Split geht – kshitij

Antwort

10

Verwenden Stringbuilder, keine Notwendigkeit zu teilen und andere Zeichenfolgen zu erstellen, und so weiter, finden Sie den Code

public static void main(String... args) { 

String text = "this is a.line is. over"; 

int pos = 0; 
boolean capitalize = true; 
StringBuilder sb = new StringBuilder(text); 
while (pos < sb.length()) { 
    if (sb.charAt(pos) == '.') { 
     capitalize = true; 
    } else if (capitalize && !Character.isWhitespace(sb.charAt(pos))) { 
     sb.setCharAt(pos, Character.toUpperCase(sb.charAt(pos))); 
     capitalize = false; 
    } 
    pos++; 
} 
System.out.println(sb.toString()); 
} 
+0

wow! das ist sauber! und erspart Ihnen den Aufwand, verschiedene Strings zu verwenden! – kshitij

+0

Ich muss auch das erste Wort (außer Whitespace) nach dem "." was kann ich dafür über das verwenden? – kshitij

+0

@kshitij ich bin froh, dass es dir gefallen hat. "Danke" ist ein bisschen besser in Vote-up und als Antwort wählen;) – Vitaly

0

anzumerken, dass Java-Strings sind unveränderlich (nicht modifizierbarer) versucht, etwas Array zu erzeugen.

Beachten Sie auch, dass sp[0].charAt(0) einen ArrayIndexOutOfBoundsException verursacht, wenn ein Leerzeichen direkt hinter einem . ist (seit dann ist der erste String leer).

Ich schlage vor, mit char[], so etwas wie:

String a = "this is.a good boy"; 
char arr[] = a.toCharArray(); 
boolean capitalize = true; 
for (int i = 0; i < arr.length; i++) 
    if (arr[i] == '.') 
    capitalize = true; 
    else if (arr[i] != ' ' && capitalize) 
    { 
    arr[i] = Character.toUpperCase(arr[i]); 
    capitalize = false; 
    } 
a = new String(arr); 

Character.isWhitespace(arr[i]) zu arr[i] != ' ' bevorzugt werden.

+0

Sie müssen das erste Zeichen zu Großbuchstaben hinzufügen – smttsp

+0

@smttsp Das erste Zeichen der Zeichenfolge? Es wird groß geschrieben, da "groß" als "wahr" beginnt. – Dukeling

+0

ohh, du hast Recht. – smttsp

0

Try this Anfangsbuchstaben des Satzes zu nutzen. Ich habe nur kleine Änderungen an Ihrem Code vorgenommen.

public static void main(String[] args) { 
    String a = "this is.a good boy"; 
    String[] dot = a.split("\\."); 
    int i = 0; 
    String output = ""; 
    while (i < dot.length) { 
     dot[i] = String.valueOf(dot[i].charAt(0)).toUpperCase() 
       + dot[i].substring(1); 
     output = output + dot[i] + "."; 
     i++; 
    } 
    System.out.println(output); 
} 

Ausgang:

This is.A good boy. 
+0

Danke, es funktioniert ganz gut, aber ich mache mir Sorgen, dass mehrere Conversions es bei größeren Daten verlangsamen könnten. – kshitij

+0

@kshitij Ich denke, das ist die beste Lösung hier, wenn Sie StringBuilder anstelle von String als Ausgabevariable verwenden. –

2

Keine Notwendigkeit zu Chaos mit Spalten und Spleißen, Sie können sich auf ein Zeichenarray an Ort und Stelle arbeiten:

String s = "this is a.line is .over "; 

char[] cs = s.toCharArray(); 

// make sure to capitalise the first letter in the string 
capitaliseNextLetter(cs, 0); 

for (int i = 0; i < cs.length; i++) { 
    // look for a period 
    if (cs[i] == '.') { 
     // capitalise the first letter after the period 
     i = capitaliseNextLetter(cs, i); 
     // we're assigning to i to skip the characters that 
     // `capitaliseNextLetter()` already looked at. 
    } 
} 

System.out.println(new String(cs)); 

// This will capitalise the first letter in the array `cs` found after 
// the index `i` 
private static int capitaliseNextLetter(char[] cs, int i) { 
    for (; i < cs.length; i++) { 
     // This will skip any non-letter after the space. Adjust the test 
     // as desired 
     if (Character.isAlphabetic(cs[i])) { 
      cs[i] = Character.toUpperCase(cs[i]); 
      return i; 
     } 
    } 
    return cs.length; 
}