【问题标题】:Issues with Converting Upper to Lower Case in Java (Could it be memory location issues?)在 Java 中将大写转换为小写的问题(可能是内存位置问题吗?)
【发布时间】:2020-09-09 03:09:50
【问题描述】:

我正在编写一个将命名转换为标准命名约定的程序。 例如,(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;
    }

【问题讨论】:

  • searchName 在最后一个位置有一个空格。
  • 但是当我显示 searchName 时,它​​确实像我预期的那样出现了 Alex Terence。问题是当我在 if 语句中用“Alex Terence”检查它时,它不会进入它
  • 因为searchName末尾有一个空格。在Alex Terence 之后添加一个空格,您会看到会发生什么。

标签: java sorting heap-memory uppercase lowercase


【解决方案1】:

这是因为末尾有一个尾随空格。 在完成 Terence 的内部 for 循环后,它会在末尾添加一个额外的空格。所以你的字符串是"Alex Terence " 而不是"Alex Terence" 在外部 for 循环之后,像这样修剪字符串以删除尾随空格。

searchName = searchName.trim()

首先防止这种情况发生的另一种方法是使用 String 类的静态 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&lt;Aupper&gt;Z,其中不包括 A/a 和 Z/z。改成:

upper >= 'A' && upper <= 'Z'
lower >= 'a' && lower <= 'z'

发生的事情是teRaNce 中的a 被传递给toLower() 方法。由于它已经是小写字母,因此不应转换它,但 a 和 z 未包含在您的条件中,因此它有资格进行转换,将 32 添加到 a,从而为您提供对应于 129 的字符。

【讨论】:

  • 我试过了,它工作正常。尝试打印出searchName.compareTo("Alex Terence") 的值,仅用于调试目的。您是否尝试过替代方法?
  • 是的,我也是。我也更新了这个问题,你能在这里找出问题吗?
  • searchName.compareTo("Alex Terence") 得到 -19
  • 在您更新的问题的答案中查看我的更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
相关资源
最近更新 更多