子例程 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))
我的一个问题集要求我创建一个子例程,该子例程将一个字符串变量作为参数,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))