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