子例程 Returns 字符串参数全部大写,应该只是第一个字母

Subroutine Returns all Capitals on a String Paramter, Should only be first letter

我的一个问题集要求我创建一个子例程,该子例程将一个字符串变量作为参数,return 除了每个单词的首字母大写外,该字符串也是相同的字符串。文中的例子使用了非标准的class教授专门设计的。我不想这样做,因为我认为使用标准 classes 学习比查看其他内容更有意义。我遇到的问题是我的子例程是 returning 一个所有大写字母的字符串。这是我的代码:

import java.util.Scanner;

public class Capitalize {

static String capitalizeString(String x) {

    String completedConversion = "";

    for (int i=0; i < x.length(); i++) {

        if (i == 0) {
            char ch = x.charAt(i);
            ch = Character.toUpperCase(ch);
            completedConversion = completedConversion + ch;
            i++;
        }

        if (Character.isLetter(i - 1)) {

            char ch = x.charAt(i);
            completedConversion = completedConversion + ch;
         }

        else {

            char ch = x.charAt(i);
            ch = Character.toUpperCase(ch);
            completedConversion = completedConversion + ch;
        }

    }

    return completedConversion;

} // End of subroutine

我还没有添加任何评论等,但应该很简单。

已解决:使用 Keammoort 的回答

public class Capitalize {

    static String capitalizeString(String x) {

        String completedConversion = "";

        for (int i=0; i < x.length(); i++) {

            if (i == 0) {
                char ch = x.charAt(i);
                ch = Character.toUpperCase(ch);
                completedConversion = completedConversion + ch;
            }

            else if (!Character.isWhitespace(x.charAt(i - 1))) {

                char ch = x.charAt(i);
                completedConversion = completedConversion + ch;

            }

            else {

                char ch = x.charAt(i);
                ch = Character.toUpperCase(ch);
                completedConversion = completedConversion + ch;
            }

        }

return completedConversion;

应该这样做,我用空格将字符串拆分(这样我就可以知道在哪里大写)到一个数组中,使用 toUpperCase()substring 将数组中的每个字符串大写,并返回再次组合在一起的字符串。

public class Capitalize 
{

    static String capitalizeString(String x) 
    {

        String[] splitString = x.split(" "); // Splits the string.
        x = "";
        for (int i = 0; i < splitString.length; i++)
            if (splitString[i].length() > 1)
                x += splitString.substring(0,1).toUpperCase() + splitString.substring(1) + " ";
            else
                x += splitString.substring(0,1).toUpperCase() + " ";
        return x;
    }
}

确定问题

这部分代码导致问题:

if (Character.isLetter(i - 1)) {
    char ch = x.charAt(i);
    completedConversion = completedConversion + ch;
} else {
    char ch = x.charAt(i);
    ch = Character.toUpperCase(ch);
    completedConversion = completedConversion + ch;
}

首先,参数类型为 int 的方法 Character.isLetter() returns 当传递的参数转换为字符(使用代码点)是字母字符时为真。因此,对于相当多的初始迭代,您将获得 false。如果 Character.isLetter() returns false 那么无论如何你都会将字母更改为大写。

获取实际字符

我觉得应该有:

if (Character.isLetter(x.charAt(i - 1))) { //added getting character from input String
    char ch = x.charAt(i);
    completedConversion = completedConversion + ch;
} else {
    char ch = x.charAt(i);
    ch = Character.toUpperCase(ch);
    completedConversion = completedConversion + ch;
}

使用 isWhitespace() 而不是 isLetter()

更好:使用 isWhitespace() 方法。它将防止数字位于单词内的情况(那么数字后的字符也将是大写的)。

if (!Character.isWhitespace(x.charAt(i - 1))) {
    //if previous char is not a whitespace don't change case
    char ch = x.charAt(i);
    completedConversion = completedConversion + ch;
} else {
    //if previous char is a whitespace change to uppercase
    char ch = x.charAt(i);
    ch = Character.toUpperCase(ch);
    completedConversion = completedConversion + ch;
}

那么紧跟在空格、制表符等之后的所有字符都将是大写的。

使用 StringBuilder

将所有这些放在一起加上使用 StringBuilder 来避免创建许多临时字符串将是:

static String capitalizeString(String x) {
    StringBuilder completedConversion = new StringBuilder();

    for (int i = 0; i < x.length(); i++) {
        if (i == 0) {
            char ch = x.charAt(i);
            ch = Character.toUpperCase(ch);
            completedConversion.append(ch);
            i++;
        }

        if (!Character.isWhitespace(x.charAt(i - 1))) {
            char ch = x.charAt(i);
            completedConversion.append(ch);
        } else {
            char ch = x.charAt(i);
            ch = Character.toUpperCase(ch);
            completedConversion.append(ch);
        }

    }

    return completedConversion.toString();
}

使用这个:

String cap = str.substring(0, 1).toUpperCase() + str.substring(1);

在第二个if里面,替换

Character.isLetter(i - 1)

Character.isLetter(x.charAt(i - 1))