2017-02-17 3 views
5

Как капитализировать первые и последние буквы каждого слова в строкеКак заработать первые и последние буквы каждого слова в строке в Java

я сделал это таким образом -

String cap = ""; 
    for (int i = 0; i < sent.length() - 1; i++) 
    { 
     if (sent.charAt(i + 1) == ' ') 
     { 
      cap += Character.toUpperCase(sent.charAt(i)) + " " + Character.toUpperCase(sent.charAt(i + 2)); 
      i += 2; 
     } 
     else 
      cap += sent.charAt(i); 
    } 
    cap += Character.toUpperCase(sent.charAt(sent.length() - 1)); 
    System.out.print (cap); 

это не работает, когда первое слово из более чем одного символа

используйте простые функции, как я новичок

+0

Как вы читаете эту "строку"? Из системы.in' или пользователь, набрав и отправив его и т. д. –

+0

Конечно, это не сработает, если вы преобразовываете символ только в том случае, если ему присваивается пробел. Вы захотите сделать это для первого символа (если 'i == 0'), а также если предыдущий символ также был пробелом. Убедитесь, что в цикле и не увеличивайте 'i' себя внутри цикла (т. Е. No' i + = 2; ') - это сэкономит вам много головных болей. – Thomas

+0

В стороне, вы никогда не должны делать строку + =. Просмотрите документацию 'StringBuilder', которая фактически используется компилятором Java под обложками. – Gray

ответ

2

Вы должны достаточно разделить вашу строку Wi th пробел как разделитель символов, то для каждого токена применяются кUpperCase() для первого и последнего символов и для создания нового String.

Очень простой пример:

String cap = ""; 
    String sent = "hello world. again."; 

    String[] token = sent.split("\\s+|\\.$"); 

    for (String currentToken : token){ 
     String firstChar = String.valueOf(Character.toUpperCase(currentToken.charAt(0))); 
     String between = currentToken.substring(1, currentToken.length()-1); 
     String LastChar = String.valueOf(Character.toUpperCase(currentToken.charAt(currentToken.length()-1))); 
     if (!cap.equals("")){ 
     cap += " "; 
     } 
     cap += firstChar+between+LastChar; 
    } 

Конечно, вы должны способствовать использованию StringBuilder над строкой, как вы выполняете много конкатенации.

результат Выход: HellO World. AgaiN

+0

Что произойдет, если предложение получило '.'? – nafas

+0

Обратите внимание, что если у вас двойное пустое пространство, вы получите исключение, так как массив будет содержать строки с нулевой длиной и, таким образом, 'currentToken.charAt (0)' сломается. – Thomas

+0

@Thomas Обычно мы ожидаем, что два слова будут разделены пробелом. Если мы не находимся в этой норме, 'String [] token = sent.split (" \\ s + ");' должен выполнять задание. – davidxxx

0

Ваш код отсутствует из первой буквы первого слова. Я бы относиться к этому, как частный случай, т.е.

cap = ""+Character.toUpperCase(sent.charAt(0)); 
for (int i = 1; i < sent.length() - 1; i++) 
{ 
..... 

Конечно, есть гораздо более простые способы, чтобы сделать то, что вы делаете.

+0

Это не сработает, если первое слово имеет только 1 букву. Тогда первая буква второго слова не заглавная. – antrep1234

4

Использование apache commons lang library становится очень легко сделать:

String testString = "this string is needed to be 1st and 2nd letter-uppercased for each word"; 

    testString = WordUtils.capitalize(testString); 
    testString = StringUtils.reverse(testString); 
    testString = WordUtils.capitalize(testString); 
    testString = StringUtils.reverse(testString); 
    System.out.println(testString); 

Этот строковый нужно быть 1ый и 2ой Письмо-верхний регистр для КАЖДОГО WORD

+0

это потрясающе. – nafas

+1

очень смешной путь :) – davidxxx

+0

Просто недостаток: если у вас есть много слов, чтобы справиться с этим, это может создать немного накладных расходов, когда вы повторяете больше, чем требуется. – davidxxx

0

В основном вам просто нужно перебирать над всеми символами и заменить их, если выполняется одно из следующих условий:

  • это первый персонаж
  • это последний персонаж
  • предыдущий символ был пробелом (или тем, что вы хотите, например. пунктуация - смотри ниже)
  • следующий символ пробела (или что вы хотите, например, знаки препинания - смотри ниже)

Если вы используете StringBuilder по соображениям производительности и памяти (не создают String в каждая итерация, которая += бы) она могла бы выглядеть следующим образом:

StringBuilder sb = new StringBuilder("some words in a list even with longer whitespace in between"); 
for(int i = 0; i < sb.length(); i++) { 
    if(i == 0 || //rule 1 
     i == (sb.length() - 1) || //rule 2 
     Character.isWhitespace(sb.charAt(i - 1)) || //rule 3 
     Character.isWhitespace(sb.charAt(i + 1))) { //rule 4 
    sb.setCharAt(i, Character.toUpperCase(sb.charAt(i))); 
    } 
} 

Результат: SomE WordS IN A LisT EveN WitH LongeR WhitespacE IN BetweeN

Если вы хотите, чтобы проверить другие правила, а (например пунктуация и т. д.), вы можете создать метод, который вы вызываете для предыдущего и следующего символа, и который проверяет требуемые свойства.

0
String stringToSearch = "this string is needed to be first and last letter uppercased for each word"; 

    // First letter upper case using regex 
Pattern firstLetterPtn = Pattern.compile("(\\b[a-z]{1})+"); 
Matcher m = firstLetterPtn.matcher(stringToSearch); 
StringBuffer sb = new StringBuffer(); 
while(m.find()){ 
    m.appendReplacement(sb,m.group().toUpperCase()); 
} 
m.appendTail(sb); 
stringToSearch = sb.toString(); 
sb.setLength(0); 

    // Last letter upper case using regex 
Pattern LastLetterPtn = Pattern.compile("([a-z]{1}\\b)+"); 
m = LastLetterPtn.matcher(stringToSearch); 
while(m.find()){ 
    m.appendReplacement(sb,m.group().toUpperCase()); 
} 
m.appendTail(sb); 
System.out.println(sb.toString()); 

output: 

ThiS StrinG IS NeedeD TO BE FirsT AnD LasT LetteR UppercaseD FoR EacH WorD 
Смежные вопросы