背景我有一个将名称的第一个字符转换为大写的函数:
public static String toTitleCase(String givenString) {
String[] arr = givenString.split(" ");
StringBuffer sb = new StringBuffer();
for (int i = 0; i < arr.length; i++) {
sb.append(Character.toUpperCase(arr[i].charAt(0))).append(arr[i].substring(1)).append(" ");
}
return sb.toString().trim();
}
我的数据来源多种多样,青少年倾向于在Facebook上显示其显示名称中的特殊字符,即使用标准英语以外的某种语言遇到名称,当通过上述功能处理此类名称时,我的代码会中断,这种情况可以替代吗?
示例名称:
Юлия Кривко
Петр Лаптиев
Михаил Дворкович
给我一个关于这些名字的索引超出范围的例外。我想知道我的功能是否正常工作或者是字符类型的问题。
修改 似乎问题伴随着空格的数量,将名字和姓氏分开:
01-15 18:32:54.326: I/System.out(5346): Aleksandr Polyakov
01-15 18:32:54.359: I/System.out(5346): java.lang.StringIndexOutOfBoundsException: length=0; index=0
01-15 18:32:54.359: I/System.out(5346): Aleksandr
01-15 18:32:54.645: I/System.out(5346): Bakhytzhan Torekeyev
01-15 18:32:54.675: I/System.out(5346): java.lang.StringIndexOutOfBoundsException: length=0; index=0
01-15 18:32:54.675: I/System.out(5346): Bakhytzhan
01-15 18:32:54.925: I/System.out(5346): Pashtet OGames
01-15 18:32:54.975: I/System.out(5346): java.lang.StringIndexOutOfBoundsException: length=0; index=0
答案 0 :(得分:4)
当名称与多于一个空格字符分隔时,将发生索引超出范围异常。在这种情况下,在创建拆分的其他空元素之后,在charAt(0)处没有任何内容。
要避免此问题,请使用正则表达式匹配多个空格。例如。 split("[ ]+")
答案 1 :(得分:1)
关于您的代码的一些其他注意事项:
1:您将名称的第一个字符设为大写。是否要将名称中的剩余字符强制为小写?示例:约翰史密斯将成为约翰史密斯。
2:我不了解其他语言,但是,在英语中,以下名称有多个字符大写(由于单引号):John O'Brian。
3:一些英文姓氏带有连字符,因此需要多个单词大写。示例:John Jones-Smith。
4:结合第2项和第3项的例子:John O'Brian-Smith。
5:在处理数据之前,您可能需要考虑修剪名称中的任何前导和尾随空格。另外,如果它只包含一个空字符串(在这种情况下,返回一个空字符串),请不要处理名称(不要调用split函数)。
即使您使用英语以外的语言处理名称,您也应该考虑上述语言的特殊条件。