2013-04-18 16 views
5

npZainwestuj pierwszy wyraz w zdaniu w ciąg z wielu zdań

String s = „To jest a.line jest .over”

powinien wyjść jak

„To jest .Wiersz is.Over”

Myślałem o użyciu ciąg tokenizer dwukrotnie

-first split using"." 

-second split using " " to get the first word 

-then change charAt[0].toUpper 

teraz ja nie jestem t pewien sposób użycia wyjścia tokenizera ciągu jako danych wejściowych dla innego?

też mogę się metodą podziału wygenerować tablicę coś próbowałem

 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

Nie potrzebujesz on drugi podział, aby zrobić charAt [0] .toUpper(), wykończenie jest wystarczające. – Pino

+0

Zobacz wcześniej [odpowiedź] (http://stackoverflow.com/questions/1892765/capitalize-first-char-of-each-word-in-a-string-java) – GrahamA

+0

@ Bhaskar - pytanie jest trochę inne tutaj mam ciąg znaków z wieloma zdaniami, więc najpierw chcę podzielić zdania, a następnie wpisać wielkie słowo. Moje zamieszanie dotyczy przechodzenia do drugiego podziału – kshitij

Odpowiedz

10

Zastosowanie StringBuilder, nie ma potrzeby, aby podzielić i tworzyć inne struny, i tak dalej, zobaczyć kod

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! to jest czyste! i oszczędza kłopotów z używaniem różnych ciągów, dzięki! – kshitij

+0

również potrzebuję wyodrębnić pierwsze słowo (z wyjątkiem spacji) po "." co mogę w tej sprawie użyć? – kshitij

+0

@kshitij Cieszę się, że Ci się podobało. "dziękuję" jest nieco lepsze pod względem głosowania i wybierania jako odpowiedź;) – Vitaly

0

Zauważ, że Java Struny są niezmienne (nie modyfikowalny).

Należy również pamiętać, że sp[0].charAt(0) spowoduje ArrayIndexOutOfBoundsException, jeśli jest miejsce bezpośrednio po . (od tego czasu pierwszy ciąg będzie pusty).

Proponuję za pomocą char[], więc coś takiego:

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]) może być korzystne arr[i] != ' '.

+0

Musisz dodać pierwszą literę, która ma być duża. – smttsp

+0

@smttsp Pierwszy znak łańcucha? Będzie to duże litery, ponieważ "capitalize" zaczyna się od "true". – Dukeling

+0

ohh, masz rację. – smttsp

0

Spróbuj wykorzystać pierwszą literę zdaniu. Właśnie wprowadziłem małe zmiany w twoim kodzie.

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); 
} 

wyjściowa:

This is.A good boy. 
+0

dzięki! działa dobrze, ale obawiam się, że wiele konwersji może spowolnić na większych danych. – kshitij

+0

@kshitij Myślę, że jest to najlepsze rozwiązanie, jeśli użyjesz StringBuilder zamiast String dla zmiennej wyjściowej. –

2

Nie trzeba zadzierać z dzielenia i łączenia, można pracować w miejscu na tablicy znaków:

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; 
}