【问题标题】:Character returns as 11 instead of B. For loop error [closed]字符返回为 11 而不是 B. For 循环错误 [关闭]
【发布时间】:2016-02-02 17:13:10
【问题描述】:

我正在尝试根据 George Lucas 的公式创建一个名称生成器,用于为他的故事中的人物(Jar Jar Binks、ObiWan Kenobi 等)创建名称。

以小写形式打印名称可以正常工作。我想要做的是让每个单词中的第一个字符变为大写。

例子:

名字布鲁斯, 姓韦恩, 母亲的娘家姓凯恩, 出生于哥谭的城市/城镇。

我的小写测试打印出来: 方式

返回名称时应返回: Waybr Kagot 反而返回... 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;
  }
}

【问题讨论】:

  • 那么你为什么使用lengthOfName + myStarWarsName.substring(1);?不应该是c + myStarWarsName.substring(1)吗?
  • @JonSkeet 谢谢!那是错误。一直在扭头,自己看不到

标签: java for-loop charat


【解决方案1】:

问题在于您将行长度连接到名字的那一行:

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"

【讨论】:

    猜你喜欢
    • 2013-07-19
    • 2018-02-22
    • 2019-04-17
    • 2018-07-30
    • 2011-09-07
    • 2012-05-15
    • 1970-01-01
    • 2022-01-21
    • 2010-11-07
    相关资源
    最近更新 更多