Я хочу использовать первую букву каждого слова. Когда я печатаю test test test
он меняется на Test Test Test
, но если я использую много пробелов между test test test
, он не меняет первые буквы на капитал. Как мне изменить свой код для правильной работы?
public class Solution
{
public static void main(String[] args) throws IOException
{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try{
String test = reader.readLine();
String[] testSplit = test.split( " " );
StringBuilder sb = new StringBuilder();
for (int I =0 ; I < testSplit.length ; I ++){
String capitalVer = capitalizeFirstLetter(testSplit[I]);
if( I != 0 ){
sb.append(" ");
}
sb.append(capitalVer);
}
System.out.println(sb.toString());
}
catch(Exception es)
{
}
}
public static String capitalizeFirstLetter(final String string)
{
if (string == null || string.equals("") )
throw new NullPointerException("no string ");
return Character.toUpperCase(string.charAt(0)) + string.substring(1);
}
}
Две вещи. Прежде всего, вы хотите разбить на пробелы:
test.split( " " )
Во-вторых, когда вы нажимаете пустые строки, ваш capitalizeFirstLetter()
генерирует исключение. Однако, поскольку вы ловите и игнорируете исключение, вы никогда его не увидите.
Причина, по которой у вас есть пустые строки, заключается в том, что вы используете одно пространство в качестве разделителя, поэтому, например, разбиение " "
приводит к 5 пустым строкам (между пробелами). Вы можете либо изменить значение capitalizeFirstLetter()
чтобы обрабатывать пустые строки, либо разделить, скажем, \s+
чтобы свернуть пробелы - обратите внимание, однако, что последний будет сбрасывать последовательные пробелы в вашем выходе.
Добавление System.out.println(Arrays.toString(testSplit))
- хороший способ увидеть, что именно содержит ваш массив.
Мораль здесь: правильно обрабатывать исключения; не просто глотать их и игнорировать. Улавливая исключения и даже не печатая информацию о них, когда они происходят, вы эффективно отключили любую информацию, которая могла бы помочь вам отследить эту проблему.
Кстати, NullPointerException
самом деле не подходит для пустой строки; IllegalArgumentException
может быть более наглядным.
Короткий и простой, выполняет всю работу:
public static String capAllFirstLetters (String s) {
String capped = "";
char prev = ' ';
for (char c : s.toCharArray()) {
capped += "" + (Character.isWhitespace(prev) ? Character.toUpperCase(c) : c);
prev = c;
}
return capped;
}
Или, если вы предпочитаете StringBuilder:
public static String capAllFirstLetters (String s) {
StringBuilder capped = new StringBuilder();
char prev = ' ';
for (char c : s.toCharArray()) {
capped.append(Character.isWhitespace(prev) ? Character.toUpperCase(c) : c);
prev = c;
}
return capped.toString();
}
замещать
String[] testSplit = test.split( "" );
с:
String[] testSplit = test.split("\\s+");
Таким образом, разбиение производится с произвольным количеством пробелов. Однако он не сохранит, сколько пробелов было между каждым словом.
String
в StringBuffer
, пройти по нему и проверить, является ли буква первым в слове, а затем использовать заглавные буквы.
String[] testSplit = test.split( "" );
должен быть String[] testSplit = test.split( " " );
и вам может понадобиться обрезать ваши результаты, поэтому capitalizeFirstLetter(testSplit[i].trim());
для удаления пробелов слева и справа.
Если вы не хотите сохранить пробелы, вам понадобится другой подход.
РЕДАКТИРОВАТЬ:
Если вы хотите, чтобы пробел оставался в вашем методе capitalizeFirstLetter
, пройдите через каждый символ и проверьте, является ли это буквой. Если это не письмо, добавьте его в строку вывода (лучше StringBuilder). Если это письмо, запишите его, добавьте, добавьте остальные и верните.
РЕДАКТИРОВАТЬ:
Свойство capitalizeFirstLetter может выглядеть так:
public static String capitalizeFirstLetter (String s) {
StringBuilder sb = new StringBuilder(); // use a StringBuilder to construct the output
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i); // get current character
if (Character.isLetter(c)) { // if character is a letter
sb.append(Character.toUpperCase(c)); // capitalize it
sb.append(s.substring(i+1)); // append the rest of the string
return sb.toString(); // return result
} else {
sb.append(c); // if character is not a letter, append character
}
}
return sb.toString(); // return result
}
try...catch
для отлова исключений. Вы просто игнорируете исключение, хотя. Ваш код вызывает исключение, но поскольку вы его игнорируете, вы никогда его не увидите. Это означает, что ваш код пытается сказать вам, что не так, но вы не можете увидеть ошибку, и поэтому вы запутались.