字符串中的隐藏字符

时间:2018-05-30 15:07:26

标签: java

我正在编写一个删除标点符号和空格的程序,然后测试该字符串是否为回文,为此,我编写了下面的代码。问题是当你输入带有标点符号的字符串(unicode字符49-30和58-66)时,它会删除它们,但用某种类型的隐藏字符替换它们。当我输入" n on"它输出"非"喜欢它应该但是新字符串的长度是4,当它应该是3.什么是这个额外的字符,我该如何摆脱它?

    System.out.println("Enter a potential palindrome:");
        strOld = scan.nextLine();

        int size = strOld.length();
        int start = 0;
        int noCap = 32;

        char[] cArray = new char[size];


        while(start<size) {

            if((strOld.charAt(start) < 48 && strOld.charAt(start) > 31)||((strOld.charAt(start) < 65 && strOld.charAt(start) > 57))){
                    start++;
            }
            else if(strOld.charAt(start) < 90 && strOld.charAt(start) > 64) {
                char c = strOld.charAt(start);
                c = (char) (c + noCap);

                cArray[start] = c;
                start++;
            }

            else {
                cArray[start] = strOld.charAt(start);
                start++;
            }
        }
        str = new String(cArray);
        System.out.println(str);
        System.out.println(str.length());

2 个答案:

答案 0 :(得分:0)

出现问题的是在代码的开头我将char数组设置为等于原始字符串的大小。 char数组填充了空值,因此如果字符串为“n on”,则从一开始就将char数组的大小设置为4。我将尝试使用ArrayList方法来修复此

    int size = strOld.length();
        int start = 0;
        int noCap = 32;

        char[] cArray = new char[size];

答案 1 :(得分:0)

在此代码的开头,您已将字符数组声明为char[] cArray = new char[size];。此语句初始化一个填充了默认char值'u0000'的数组。所以当您最终从此数组创建一个String时如果只有3个有效字符,它将转换为长度为4的字符串。

我们可以使用ArrayList作为解决方案。我们可以创建一个角色对象的ArrayList,如下所示。 ArrayList<Character> cArray = new ArrayList<>();  这只会在堆中创建一个空的ArrayList对象。不需要声明ArrayList的大小。重要的是,ArrayList可以动态地改变大小。我们可以使用cArray.add(c);向它添加元素。

最后要将ArrayList对象转换为String,我们可以使用StringBuilder对象。当我们使用ArrayList时,没有'u0000'默认值。因此,当您输入n on时,输出将为non,长度将为3。修改后的代码将如下。

    System.out.println("Enter a potential palindrome:");
    String strOld = scan.nextLine();

    int size = strOld.length();
    int start = 0;
    int noCap = 32;

    //char[] cArray = new char[size];
    ArrayList<Character> cArray = new ArrayList<>();

    while (start < size) {

        if ((strOld.charAt(start) < 48 && strOld.charAt(start) > 31) || ((strOld.charAt(start) < 65 && strOld.charAt(start) > 57))) {
            start++;
        } else if (strOld.charAt(start) < 90 && strOld.charAt(start) > 64) {
            char c = strOld.charAt(start);
            c = (char) (c + noCap);

            cArray.add(c);
            start++;
        } else {
            cArray.add(strOld.charAt(start));
            start++;
        }
    }
    StringBuilder result = new StringBuilder(cArray.size());
    for (Character c : cArray) {
        result.append(c);
    }
    String str = result.toString();
    System.out.println(str);
    System.out.println(str.length());