只使一个单词的第一个字母大写

时间:2013-11-11 00:26:33

标签: java string uppercase

我有一个方法可以将句子中单词的所有首字母转换为大写。

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

我尝试了很多东西。一个嵌套循环,用于检查每个单词中的每个字母,如果有重复,则忽略第二个字母。我使用了计数器,布尔值等。没有什么工作,我一直得到相同的结果。

我该怎么办?我只想要大写的第一个字母。

3 个答案:

答案 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代替
    1. 收到第一封信,
    2. 创建其大写版本
    3. 将其与其余的字符串连接起来,可以在substring方法的帮助下创建。
  • 由于您使用的是使用正则表达式的replace(String, String),因此您可以在要替换的字符^之前添加replace("^a","A")^表示开始输入,因此它只会替换输入开始后放置的a

我可能会使用第二种方法。


目前在每个循环中,您的代码都会创建新的StringBuilder,其数据存储在resultappend新词中,并重新分配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 []的方法来确保如果只更改单个字符,则不需要分配额外的内存。

请注意,只需要编译一次模式,因此您可以将其保存为某个类变量。