在空格大写后生成字符?

htrmnn0y  于 2021-07-08  发布在  Java
关注(0)|答案(5)|浏览(225)

我想让每个空格后面的字母都变成大写。有人能告诉我下列方法有什么问题吗?鉴于 phrase “this is a test”返回“this is a test”而不是“this is a test”

public String toTitleCase(String phrase) {
    for (int i=0; i<phrase.length(); i++) {
        if(phrase.substring(i,i+1).equals(" ")) {
            phrase = phrase.replace(phrase.substring(i+1,i+2),phrase.substring(i+1,i+2).toUpperCase());
        }
    }
    return phrase;
}
ny6fqffe

ny6fqffe1#

使用streams(或split)将字符串拆分为多个部分,不要手动使用substring。
尝试以下代码

String test = "this is a test";

        UnaryOperator<String> capitalize = str ->
                str.substring(0,1).toUpperCase() + str.substring(1).toLowerCase();

        String result =
                Stream.of(
                        test.split(" ")
                ).map(capitalize)
                .collect(
                        Collectors.joining(" ")
                );

        System.out.println(result);

输出: This Is A Test

xytpbqjk

xytpbqjk2#

当您替换一个子串时,它将替换该子串的每一个匹配项—不一定是您要替换的子串。这就是为什么它要替换单词中的字母。
在这里切换到stringbuilder以插入单个字符。请注意,我们不会遍历整个字符串,因为最后一个字符没有下一个要大写的字符。

public String toTitleCase(String phrase) {
  StringBuilder sb = new StringBuilder(phrase);
  for (int index = 0 ; index < phrase.length - 1 ; ++index) {
    if (sb.charAt(index) == ' ') {
      sb.setCharAt(index + 1, Character.toUppercase(sb.charAt(index + 1)));
    }
  }
  return sb.toString();
}
zf2sa74q

zf2sa74q3#

如果一个字母在任何一个单词中都是第一个,那么它将在任何地方被替换。在你的情况下,所有的t,i和a都是大写的。以is为例。以前找个地方是很困难的。而不是在身体里,实际上发生了什么:

phrase = phrase.replace("i","I");

所有的我都被我取代了。字符串类不能在特定位置替换。
您必须选择:
使用可以在特定位置替换的stringbuilder。

String toTitleCase(String phrase) {
        StringBuilder sb= new StringBuilder(phrase);
        for (int i=0; i<phrase.length(); i++) {
            if(i==0 || phrase.charAt(i-1)==' ') {
                sb.replace(i,i+1,phrase.substring(i,i+1).toUpperCase());
            }
        }
        return sb.toString();
    }

或者使用stream,这是我比较喜欢的方法,因为只有一行。这样您就不会保留空格(多个连续的空格将被替换为只有一个空格),但通常您需要这样做。

Arrays.asList(phrase.split("\\s+")).stream().map(x->x.substring(0,1).toUpperCase()+x.substring(1)).collect(Collectors.joining(" "));
s4chpxco

s4chpxco4#

代码中的问题是 String.replace 替换中存在的每个目标角色 String 不仅是你想要的。
您可以直接处理字符数组,而不是 String :

public static String toTitleCase(String phrase) {

    // convert the string to an array 
    char[] phraseChars = phrase.toCharArray();

    for (int i = 0; i < phraseChars.length - 1; i++) {
        if(phraseChars[i] == ' ') {
            phraseChars[i+1] = Character.toUpperCase(phraseChars[i+1]);
        }
    }

    // convert the array to string
    return String.valueOf(phraseChars);
}
z9ju0rcb

z9ju0rcb5#

它正在取代一切 t ,请尝试以下代码。
它会帮助你的。

String phrase="this is a test";
            for (int i=0; i<phrase.length(); i++) {
                if(phrase.substring(i,i+1).equals(" ")) {
                    System.out.println(phrase.substring(i+1,i+2));
                    phrase = phrase.replace(phrase.substring(i,i+2),phrase.substring(i,i+2).toUpperCase());
                }
            }
System.out.println(phrase);

相关问题