我有一个方法可以将句子中单词的所有首字母转换为大写。
public static String toTitleCase(String s)
{
String result = "";
String[] words = s.split(" ");
for (int i = 0; i < words.length; i++)
{
result += words[i].replace(words[i].charAt(0)+"", Character.toUpperCase(words[i].charAt(0))+"") + " ";
}
return result;
}
问题是该方法将单词中的每个字母转换为与第一个字母相同的单词。例如,字符串标题以TiTle
形式出现对于输入this is a title
,这将成为输出This Is A TiTle
我尝试了很多东西。一个嵌套循环,用于检查每个单词中的每个字母,如果有重复,则忽略第二个字母。我使用了计数器,布尔值等。没有什么工作,我一直得到相同的结果。
我该怎么办?我只想要大写的第一个字母。
答案 0 :(得分:3)
不要使用replace()
方法,请尝试replaceFirst()
。
result += words[i].replaceFirst(words[i].charAt(0)+"", Character.toUpperCase(words[i].charAt(0))+"") + " ";
将输出:
This Is A Title
答案 1 :(得分:0)
问题是您正在使用replace
方法替换所有出现的描述字符。要解决这个问题,你可以
replaceFirst
代替substring
方法的帮助下创建。replace(String, String)
,因此您可以在要替换的字符^
之前添加replace("^a","A")
。 ^
表示开始输入,因此它只会替换输入开始后放置的a
。我可能会使用第二种方法。
目前在每个循环中,您的代码都会创建新的StringBuilder
,其数据存储在result
,append
新词中,并重新分配result
的{{1}}输出}}。
这是感染性的方法。相反,您应该在循环之前创建toString()
表示结果,并在循环内创建StringBuilder
个新单词,在循环结束后,您可以使用append
方法获取其String版本。
答案 2 :(得分:0)
做一些Regex-Magic可以简化你的任务:
public static void main(String[] args) {
final String test = "this is a Test";
final StringBuffer buffer = new StringBuffer(test);
final Pattern patter = Pattern.compile("\\b(\\p{javaLowerCase})");
final Matcher matcher = patter.matcher(buffer);
while (matcher.find()) {
buffer.replace(matcher.start(), matcher.end(), matcher.group().toUpperCase());
}
System.out.println(buffer);
}
表达式\\b(\\p{javaLowerCase})
匹配“单词的开头后跟小写字母”,而matcher.group()
等于匹配部分中()内的whats。示例:在“t”上应用“test”匹配,因此start为0,end为1,group为“t”。这可以很容易地通过大量文本运行,并替换所有需要替换的字母。
此外:使用StringBuffer(或类似的)进行字符串操作总是一个好主意,因为Java中的每个String都是唯一的。也就是说,如果你执行result += stringPart
之类的操作,那么每次调用它时你实际上都会创建一个新的String(等于result + stringPart)。因此,如果您使用10个部分执行此操作,您最终将在内存中至少有10个不同的字符串,而您只需要一个,这是最后一个。
StringBuffer使用类似char []的方法来确保如果只更改单个字符,则不需要分配额外的内存。
请注意,只需要编译一次模式,因此您可以将其保存为某个类变量。