Первая буква не меняется на заглавную при использовании большого количества пробелов между словами

1

Я хочу использовать первую букву каждого слова. Когда я печатаю 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);
    }
    }
Теги:

4 ответа

1
Лучший ответ

Две вещи. Прежде всего, вы хотите разбить на пробелы:

test.split( " " )

Во-вторых, когда вы нажимаете пустые строки, ваш capitalizeFirstLetter() генерирует исключение. Однако, поскольку вы ловите и игнорируете исключение, вы никогда его не увидите.

Причина, по которой у вас есть пустые строки, заключается в том, что вы используете одно пространство в качестве разделителя, поэтому, например, разбиение " " приводит к 5 пустым строкам (между пробелами). Вы можете либо изменить значение capitalizeFirstLetter() чтобы обрабатывать пустые строки, либо разделить, скажем, \s+ чтобы свернуть пробелы - обратите внимание, однако, что последний будет сбрасывать последовательные пробелы в вашем выходе.

Добавление System.out.println(Arrays.toString(testSplit)) - хороший способ увидеть, что именно содержит ваш массив.

Мораль здесь: правильно обрабатывать исключения; не просто глотать их и игнорировать. Улавливая исключения и даже не печатая информацию о них, когда они происходят, вы эффективно отключили любую информацию, которая могла бы помочь вам отследить эту проблему.

Кстати, NullPointerException самом деле не подходит для пустой строки; IllegalArgumentException может быть более наглядным.

  • 0
    извини, я не понимаю
  • 0
    @Predict_it Какую часть вы не понимаете? У вас есть блок try...catch для отлова исключений. Вы просто игнорируете исключение, хотя. Ваш код вызывает исключение, но поскольку вы его игнорируете, вы никогда его не увидите. Это означает, что ваш код пытается сказать вам, что не так, но вы не можете увидеть ошибку, и поэтому вы запутались.
Показать ещё 3 комментария
0

Короткий и простой, выполняет всю работу:

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

замещать

String[] testSplit = test.split( "" );

с:

String[] testSplit = test.split("\\s+");

Таким образом, разбиение производится с произвольным количеством пробелов. Однако он не сохранит, сколько пробелов было между каждым словом.

  • 0
    это положить слова вместе, но я хочу, чтобы разделить между словами
  • 0
    Тогда вам, вероятно, лучше не использовать регулярное выражение для разделения строки, так как это не сохранит такую информацию. Вероятно, лучше поместить String в StringBuffer , пройти по нему и проверить, является ли буква первым в слове, а затем использовать заглавные буквы.
0

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
}
  • 0
    да, я хочу сохранить это пространство между словами.
  • 0
    @Predict_it см. Обновленный ответ
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню