字符returns为11而不是B。for循环错误
Character returns as 11 instead of B. For loop error
我正在尝试根据乔治卢卡斯的公式制作一个名称生成器,用于为他的故事中的角色(Jar Jar Binks、ObiWan Kenobi 等)创建名称。
打印出小写的名字效果很好。我想做的是让每个单词的第一个字符大写。
示例:
名字布鲁斯,
姓氏 韦恩,
母亲娘家姓 Kane,
city/town出生于哥谭.
我的小写测试打印出:
waybr kagot
当 return 输入名称时,它应该 return:
Waybr Kagot 而不是 returns... 11aybr Kagot
我似乎找不到导致此错误的原因。我希望有人能帮助我:)
public class NameGenerator {
public NameGenerator()
{
}
public String generateStarWarsName(String firstName, String lastName, String motherMaidenName, String cityBorn)
{
String first = firstName.toLowerCase();
String last = lastName.toLowerCase();
String maiden = motherMaidenName.toLowerCase();
String city = cityBorn.toLowerCase();
String myStarWarsFirstName = last.substring(0, 3) + first.substring(0, 2);
String myStarWarsLastName = maiden.substring(0, 2) + city.substring(0, 3);
String myStarWarsNameInLowerCase = myStarWarsFirstName + " " + myStarWarsLastName;
// Test the name
System.out.println(myStarWarsNameInLowerCase);
// Make first character in word uppercase
String myStarWarsName = myStarWarsNameInLowerCase.trim();
int lengthOfName = myStarWarsName.length();
char c = Character.toUpperCase(myStarWarsName.charAt(0));
myStarWarsName = lengthOfName + myStarWarsName.substring(1);
for (int i = 0; i < lengthOfName; i++) {
if (myStarWarsName.charAt(i) == ' ') {
c = Character.toUpperCase(myStarWarsName.charAt(i + 1));
myStarWarsName = myStarWarsName.substring(0, i) + " " + c + myStarWarsName.substring(i + 2);
}
}
return myStarWarsName;
}
}
问题出在您将行的长度连接到名字的行:
myStarWarsName = lengthOfName + myStarWarsName.substring(1);
转换为:
从字符串的整数长度和从 myStarWarsName 字符串的第二个位置开始的 myStarwarsName 的子字符串的组合将字符串声明为 myStarWarsName。
将其更改为以下内容以仅将字符串的第一个字符大写:
myStarWarsName = myStarWarsName.substring(0, 1).toUpperCase() + myStarWarsName.substring(1);
这将把名字的第一个字母大写。
您可以更进一步,通过在空格处拆分名称来将每个名称的首字母大写,然后将每个名称连接到 myStarWarsName 字段的末尾:
String myStarWarsName = new String("obi wan kenobi");
String[] names = myStarWarsName.split(" ");
String result = new String();
for(String name : names){
name = name.substring(0, 1).toUpperCase() + name.substring(1);
result.concat(name).concat(" ");
}
myStarWarsName = result.trim();
//myStarWarsName is now "Obi Wan Kenobi"
我正在尝试根据乔治卢卡斯的公式制作一个名称生成器,用于为他的故事中的角色(Jar Jar Binks、ObiWan Kenobi 等)创建名称。
打印出小写的名字效果很好。我想做的是让每个单词的第一个字符大写。
示例:
名字布鲁斯, 姓氏 韦恩, 母亲娘家姓 Kane, city/town出生于哥谭.
我的小写测试打印出: waybr kagot
当 return 输入名称时,它应该 return: Waybr Kagot 而不是 returns... 11aybr Kagot
我似乎找不到导致此错误的原因。我希望有人能帮助我:)
public class NameGenerator {
public NameGenerator()
{
}
public String generateStarWarsName(String firstName, String lastName, String motherMaidenName, String cityBorn)
{
String first = firstName.toLowerCase();
String last = lastName.toLowerCase();
String maiden = motherMaidenName.toLowerCase();
String city = cityBorn.toLowerCase();
String myStarWarsFirstName = last.substring(0, 3) + first.substring(0, 2);
String myStarWarsLastName = maiden.substring(0, 2) + city.substring(0, 3);
String myStarWarsNameInLowerCase = myStarWarsFirstName + " " + myStarWarsLastName;
// Test the name
System.out.println(myStarWarsNameInLowerCase);
// Make first character in word uppercase
String myStarWarsName = myStarWarsNameInLowerCase.trim();
int lengthOfName = myStarWarsName.length();
char c = Character.toUpperCase(myStarWarsName.charAt(0));
myStarWarsName = lengthOfName + myStarWarsName.substring(1);
for (int i = 0; i < lengthOfName; i++) {
if (myStarWarsName.charAt(i) == ' ') {
c = Character.toUpperCase(myStarWarsName.charAt(i + 1));
myStarWarsName = myStarWarsName.substring(0, i) + " " + c + myStarWarsName.substring(i + 2);
}
}
return myStarWarsName;
}
}
问题出在您将行的长度连接到名字的行:
myStarWarsName = lengthOfName + myStarWarsName.substring(1);
转换为:
从字符串的整数长度和从 myStarWarsName 字符串的第二个位置开始的 myStarwarsName 的子字符串的组合将字符串声明为 myStarWarsName。
将其更改为以下内容以仅将字符串的第一个字符大写:
myStarWarsName = myStarWarsName.substring(0, 1).toUpperCase() + myStarWarsName.substring(1);
这将把名字的第一个字母大写。
您可以更进一步,通过在空格处拆分名称来将每个名称的首字母大写,然后将每个名称连接到 myStarWarsName 字段的末尾:
String myStarWarsName = new String("obi wan kenobi");
String[] names = myStarWarsName.split(" ");
String result = new String();
for(String name : names){
name = name.substring(0, 1).toUpperCase() + name.substring(1);
result.concat(name).concat(" ");
}
myStarWarsName = result.trim();
//myStarWarsName is now "Obi Wan Kenobi"