在 Java 中将大写字母转换为小写字母的问题(可能是内存位置问题?)
Issues with Converting Upper to Lower Case in Java (Could it be memory location issues?)
我正在编写一个程序,将命名转换为标准命名约定。
例如,(aLeX teReNce = Alex Terence) 和另一个例子,(kImBerLy tAn > Kimberly Tan) 我已经成功转换了它,但是在比较时,程序会失败。我能知道这里有什么问题吗?还有其他解决方法吗?除了 toUpper 和 toLower 之外还有其他方法吗?
会不会和内存位置有关?因为当我将 aLeX teReNce 更改为 aLeX teRaNce 时,我在那里得到了一些奇怪的符号,程序似乎正在显示内存地址
谢谢!
public static void main(String args[])
{
String searchName = "aLeX teReNce";
String[] str = searchName.split(" ");
searchName = "";
for(int i = 0; i < str.length; i++)
{
searchName += toUpper(str[i].charAt(0));
for(int j = 1; j < str[i].length(); j++)
{
searchName += toLower(str[i].charAt(j));
}
searchName += " ";
}
searchName = searchName.trim();
System.out.println("After Rearrange: " + searchName);
System.out.println();
if(searchName.equals("Alex Terence"))
{
System.out.println("True");
}
}
public static char toUpper(char upper)
{
if(!(upper > 'A' && upper < 'Z'))
{
upper = (char)((int)(upper) - 32);
}
return upper;
}
public static char toLower(char lower)
{
if(!(lower > 'a' && lower < 'z'))
{
lower = (char)((int)(lower) + 32);
}
return lower;
}
这是因为末尾有一个尾随空格。
在完成 Terence
的内部 for 循环后,它在末尾添加了一个额外的空格。所以你的字符串是 "Alex Terence "
而不是 "Alex Terence"
在外部 for 循环 trim 之后,这样的字符串将删除尾随空格。
searchName = searchName.trim()
首先防止这种情况发生的另一种方法是使用字符串 class.
的静态 join()
方法
public static void main(String args[])
{
String searchName = "aLeX teReNce";
String[] str = searchName.split(" ");
searchName = "";
for(int i = 0; i < str.length; i++)
{
searchName += toUpper(str[i].charAt(0));
for(int j = 1; j < str[i].length(); j++)
{
searchName += toLower(str[i].charAt(j));
}
str[i] = searchName;
}
searchName = String.join(" ", str);
System.out.println("After Rearrange: " + searchName);
System.out.println();
if(searchName.equals("Alex Terence"))
{
System.out.println("True");
}
}
编辑:
你得到这个奇怪的符号是因为你的 toUpper()
和 toLower()
方法都有错误。
如果您的名字中有 a/A 或 z/Z,它不会给您正确的输出,因为您已将条件声明为 upper<A
和 upper>Z
,其中不包括A/a 和 Z/z。将其更改为:
upper >= 'A' && upper <= 'Z'
lower >= 'a' && lower <= 'z'
发生的事情是 teRaNce
中的 a
被传递给 toLower()
方法。由于它已经是小写字母,因此不应进行转换,但 a 和 z 未包含在您的条件中,因此它有资格进行转换,将 32 添加到 a
,从而为您提供对应于 129.[=25= 的字符]
我正在编写一个程序,将命名转换为标准命名约定。 例如,(aLeX teReNce = Alex Terence) 和另一个例子,(kImBerLy tAn > Kimberly Tan) 我已经成功转换了它,但是在比较时,程序会失败。我能知道这里有什么问题吗?还有其他解决方法吗?除了 toUpper 和 toLower 之外还有其他方法吗?
会不会和内存位置有关?因为当我将 aLeX teReNce 更改为 aLeX teRaNce 时,我在那里得到了一些奇怪的符号,程序似乎正在显示内存地址
谢谢!
public static void main(String args[])
{
String searchName = "aLeX teReNce";
String[] str = searchName.split(" ");
searchName = "";
for(int i = 0; i < str.length; i++)
{
searchName += toUpper(str[i].charAt(0));
for(int j = 1; j < str[i].length(); j++)
{
searchName += toLower(str[i].charAt(j));
}
searchName += " ";
}
searchName = searchName.trim();
System.out.println("After Rearrange: " + searchName);
System.out.println();
if(searchName.equals("Alex Terence"))
{
System.out.println("True");
}
}
public static char toUpper(char upper)
{
if(!(upper > 'A' && upper < 'Z'))
{
upper = (char)((int)(upper) - 32);
}
return upper;
}
public static char toLower(char lower)
{
if(!(lower > 'a' && lower < 'z'))
{
lower = (char)((int)(lower) + 32);
}
return lower;
}
这是因为末尾有一个尾随空格。
在完成 Terence
的内部 for 循环后,它在末尾添加了一个额外的空格。所以你的字符串是 "Alex Terence "
而不是 "Alex Terence"
在外部 for 循环 trim 之后,这样的字符串将删除尾随空格。
searchName = searchName.trim()
首先防止这种情况发生的另一种方法是使用字符串 class.
的静态join()
方法
public static void main(String args[])
{
String searchName = "aLeX teReNce";
String[] str = searchName.split(" ");
searchName = "";
for(int i = 0; i < str.length; i++)
{
searchName += toUpper(str[i].charAt(0));
for(int j = 1; j < str[i].length(); j++)
{
searchName += toLower(str[i].charAt(j));
}
str[i] = searchName;
}
searchName = String.join(" ", str);
System.out.println("After Rearrange: " + searchName);
System.out.println();
if(searchName.equals("Alex Terence"))
{
System.out.println("True");
}
}
编辑:
你得到这个奇怪的符号是因为你的 toUpper()
和 toLower()
方法都有错误。
如果您的名字中有 a/A 或 z/Z,它不会给您正确的输出,因为您已将条件声明为 upper<A
和 upper>Z
,其中不包括A/a 和 Z/z。将其更改为:
upper >= 'A' && upper <= 'Z'
lower >= 'a' && lower <= 'z'
发生的事情是 teRaNce
中的 a
被传递给 toLower()
方法。由于它已经是小写字母,因此不应进行转换,但 a 和 z 未包含在您的条件中,因此它有资格进行转换,将 32 添加到 a
,从而为您提供对应于 129.[=25= 的字符]