изменение первой буквы CharSequence на верхний регистр в Android

это может показаться простым, но в нем много ошибок, которые я пробовал следующим образом:

 String s = gameList[0].toString();
s.replaceFirst(String.valueOf(s.charAt(0)),String.valueOf(Character.toUpperCase(s.charAt(0))) );

и выдает исключение

еще одна попытка, которую я имел, была:

String s = gameList[0].toString();
char c = Character.toUpperCase(gameList[0].charAt(0));
gameList[0] = s.subSequence(1, s.length());

этот также выдает исключение


person yoav.str    schedule 23.06.2010    source источник
comment
Полученное вами исключение может помочь людям ответить на этот вопрос.   -  person tim_yates    schedule 23.06.2010


Ответы (4)


. . . или сделать все это в массиве. Вот что-то похожее.

    String titleize(String source){
        boolean cap = true;
        char[]  out = source.toCharArray();
        int i, len = source.length();
        for(i=0; i<len; i++){
            if(Character.isWhitespace(out[i])){
                cap = true;
                continue;
            }
            if(cap){
                out[i] = Character.toUpperCase(out[i]);
                cap = false;
            }
        }
        return new String(out);
    }
person MartynOfEngland    schedule 23.10.2012

О неизменяемости строки

Что касается вашей первой попытки:

String s = gameList[0].toString();
s.replaceFirst(...);

Строки Java неизменяемы. Вы не можете вызвать метод для экземпляра строки и ожидать, что метод изменит эту строку. replaceFirst вместо этого возвращает новую строку. Это означает, что эти виды использования неверны:

s1.trim();
s2.replace("x", "y");

Вместо этого вы хотели бы сделать что-то вроде этого:

s1 = s1.trim();
s2 = s2.replace("x", "y");

Что касается замены первой буквы CharSequence на прописную, работает примерно так (как видно на ideone.com):

    static public CharSequence upperFirst(CharSequence s) {
        if (s.length() == 0) {
            return s;
        } else {
            return Character.toUpperCase(s.charAt(0))
                + s.subSequence(1, s.length()).toString();
        }
    }
    public static void main(String[] args) {
        String[] tests = {
            "xyz", "123 abc", "x", ""
        };
        for (String s : tests) {
            System.out.printf("[%s]->[%s]%n", s, upperFirst(s));
        }
        // [xyz]->[Xyz]
        // [123 abc]->[123 abc]
        // [x]->[X]
        // []->[]

        StringBuilder sb = new StringBuilder("blah");
        System.out.println(upperFirst(sb));
        // prints "Blah"
    }

Это, конечно, выдаст NullPointerException, если s == null. Часто это правильное поведение.

person polygenelubricants    schedule 23.06.2010

Мне нравится использовать это более простое решение для имен, где toUp — это массив полных имен, разделенный (" "):

for (String name : toUp) {
    result = result + Character.toUpperCase(name.charAt(0)) + 
             name.substring(1).toLowerCase() + " ";
}

И это модифицированное решение можно использовать для прописной буквы только первой буквы полной строки, опять же, toUp — это список строк:

for (String line : toUp) {
    result = result + Character.toUpperCase(line.charAt(0)) + 
             line.substring(1).toLowerCase();
}

Надеюсь это поможет.

person Herrera    schedule 31.05.2013

person    schedule
comment
моя проблема была настолько тривиальной, что все дело в нулевой строке - person yoav.str; 23.06.2010