Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-在空格大写后生成字符?_Java - Fatal编程技术网

Java-在空格大写后生成字符?

Java-在空格大写后生成字符?,java,Java,我想让每个空格后的字母都变成大写。有人能告诉我下面的方法有什么问题吗?给定短语thisatest,它返回thisatest,而不是thisatest 公共字符串totitlecasstring短语{ 对于int i=0;i它将替换所有t,请尝试下面的代码 它会帮助你的 String phrase="this is a test"; for (int i=0; i<phrase.length(); i++) { i

我想让每个空格后的字母都变成大写。有人能告诉我下面的方法有什么问题吗?给定短语thisatest,它返回thisatest,而不是thisatest

公共字符串totitlecasstring短语{ 对于int i=0;i它将替换所有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);

使用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);

输出:这是一个测试

代码中的问题是替换字符串中存在的每个目标字符,而不仅仅是您想要的目标字符

您可以直接处理字符数组,而不是字符串:


当你替换一个子串时,它会替换该子串的每一个匹配项,而这个子串不一定是你要替换的。这就是为什么它要替换单词中的字母

在这里切换到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();
}

如果一个字母在任何单词中都是第一个,那么它将被替换到任何地方。在你的情况下,所有的t、i和a都将是大写的。 以is为例。它是在if body之前找到一个空格。而不是在if body中,实际发生了什么:

phrase = phrase.replace("i","I"); 
所有的我都被我取代了。 无法在特定位置替换字符串类

您必须选择以下选项:

使用StringBuilder,可以在特定位置替换。
有很多方法可以做到这一点,这与@Loris Securo给出的答案基本相同-唯一的区别是我使用的是StringBuilder,而不是char[]。
phrase = phrase.replace("i","I"); 
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();
    }
Arrays.asList(phrase.split("\\s+")).stream().map(x->x.substring(0,1).toUpperCase()+x.substring(1)).collect(Collectors.joining(" "));