2013-04-18 28 views
5

ví dụ:hoa từ đầu tiên của một câu trong một chuỗi với nhiều câu

String s = "đây là a.line là .over"

nên đi ra như

"Đây là một .Line is.Over"

tôi nghĩ của việc sử dụng chuỗi tokenizer hai lần

-first split using"." 

-second split using " " to get the first word 

-then change charAt[0].toUpper 

bây giờ tôi không có t chắc chắn làm thế nào để sử dụng đầu ra của chuỗi tokenizer như đầu vào cho người khác?

cũng tôi có thể sử dụng phương pháp phân chia để tạo mảng một cái gì đó tôi đã cố gắng

 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

Bạn không cần t ông thứ hai chia để làm cho charAt [0] .toUpper(), một trim là đủ. – Pino

+0

Xem câu trả lời trước đó [answer] (http://stackoverflow.com/questions/1892765/capitalize-first-char-of-each-word-in-a-string-java) – GrahamA

+0

@ Bhaskar- câu hỏi có một chút khác biệt ở đây tôi có một chuỗi với nhiều câu như vậy đầu tiên tôi muốn chia các câu sau đó tận dụng từ .. sự nhầm lẫn của tôi là về làm thế nào để vượt qua để phân chia thứ hai – kshitij

Trả lời

10

Sử dụng StringBuilder, không cần phải chia và tạo ra chuỗi khác, và như vậy, xem mã

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! sạch sẽ! và tiết kiệm các rắc rối của việc sử dụng các chuỗi khác nhau cảm ơn! – kshitij

+0

Tôi cũng cần trích xuất từ ​​đầu tiên (trừ khoảng trắng) sau dấu "." những gì tôi có thể sử dụng cho rằng hơn này? – kshitij

+0

@kshitij Tôi rất vui vì bạn thích nó. "cảm ơn" tốt hơn một chút khi bỏ phiếu và chọn câu trả lời;) – Vitaly

0

Lưu ý rằng Java Strings là không thay đổi (không thay đổi được).

Cũng lưu ý rằng sp[0].charAt(0) sẽ gây ra một ArrayIndexOutOfBoundsException nếu có không gian trực tiếp sau . (kể từ đó chuỗi đầu tiên sẽ trống).

tôi đề nghị sử dụng char[], vì vậy cái gì đó như:

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]) có thể được ưa thích để arr[i] != ' '.

+0

Bạn cần thêm ký tự đầu tiên vào chữ hoa – smttsp

+0

@smttsp Ký tự đầu tiên của chuỗi? Nó sẽ là chữ hoa khi 'capitalize' bắt đầu bằng' true'. – Dukeling

+0

ohh, bạn nói đúng. – smttsp

0

Hãy thử điều này để tận dụng chữ cái đầu tiên của câu. Tôi chỉ thực hiện một số thay đổi nhỏ trong mã của bạn.

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

Output:

This is.A good boy. 
+0

cảm ơn! nó hoạt động tốt nhưng tôi lo lắng rằng nhiều chuyển đổi có thể làm chậm nó xuống trên dữ liệu lớn hơn. – kshitij

+0

@ kshitij Tôi nghĩ đây là giải pháp tốt nhất ở đây nếu bạn sử dụng StringBuilder thay vì String cho biến đầu ra. –

2

Không cần phải gây rối với tách và ghép nối, bạn có thể làm việc tại chỗ trên một mảng ký tự:

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; 
} 
Các vấn đề liên quan