Java解码字符串甚至长度工作但奇数长度不工作

时间:2013-08-08 11:58:47

标签: java string algorithm sorting decode

我正在编写一个具有多种编码方案的程序,其中一个是主要的移位,基于键是偶数还是奇数。 解码方案如下:

The key is checked to see whether it is odd or even. For an odd key, odd numbered characters are in order first in the new string, then all even indexes. If the key is even all even indexes are first, then all the odd indexes

因此对于字符串“abcdefg”和27的键,新字符串应为“bdfaceg” 如果密钥是28,则新字符串应为“acegbdf”

奇怪的是 如果密钥是奇数,并且字符串长度是奇数或偶数,则它完全解码。 如果键是偶数且字符串长度是偶数,则它将解码正常,

但如果键是偶数且字符串长度为奇数,则无法正确解码。

使用测试字符串“在此处输入消息”。这些是我的出局::

Encoded Key = 28 ; Encoded Message "EtrMsaehr.ne esg ee" Message length = 19
Decoded Key = 28 ; Decoded Message "E.tnreM seasegh renull"

所以偶数条目在正确的位置,但是奇数的条目要么被反向拉动,要么被奇数索引推回,我认为...... 我认为将它们推回索引是最简单的,但我仍然是Java的新手,我不知道该怎么做。

以下是我在此实例中使用的函数的代码。

protected String decode(String a, int k)
{
    System.out.println(a.length());
    String[] out = new String [a.length()];
    String decode = a;
    int key = k;
    boolean kP = IsEven(key);
    String odd = "";

    if (kP)
    {
        //Key is even
        try
        {
            int f = 0;
            for (int i =0 ; i<(a.length()/2); i++)
            {
                out[f] = Character.toString(a.charAt(i));
                f+=2;
            }
            int g = 1;
            for (int i = (a.length()/2) ; i<(a.length()); i++)
            {
                out[g] = Character.toString(a.charAt(i));
                g+=2;
            }
        }
        catch ( IndexOutOfBoundsException e )
        {
            System.out.println("Out of bounds");
            while(true)
                break;
        }
    }
    else
    {
        //key is odd
        try
        {
            int f = 1;
            for (int i =0 ; i<(a.length()/2); i++)
            {
                    out[f] = Character.toString(a.charAt(i));
                    f+=2;
            }

            int g = 0;
            for (int i = (a.length()/2) ; i<(a.length()); i++)
            {
                    out[g] = Character.toString(a.charAt(i));
                    g+=2;
            }
        }
        catch ( IndexOutOfBoundsException e )
        {
            System.out.println("Out of bounds");
            while(true)
                break;
        }
    }
    for (int i = 0 ; i<a.length(); i++)
            odd += out[i];
        System.out.println(odd);
    return(odd);
}

2 个答案:

答案 0 :(得分:1)

通过代码,即使是手动,也可以找到一些简单的例子:

  • 重点:2;字符串:“A”

  • 重点:2;字符串:“AB”

  • 重点:2;字符串:“ABC”

详细检查发生了什么。当你知道发生了什么事后,你可以纠正这个问题。

答案 1 :(得分:1)

你的问题是当它是一个偶数键和一个奇数字符串时,编码字符串的第一个“序列”中会有另外一个字符,你没有考虑到这一点:

  

如果密钥为28,则新字符串应为“acegbdf”

上面的例子首先是4个字符,然后是3个字符。

在你的代码中,你运行到(a.length()/2),上面的字符串是3,这意味着你使用索引0,1和2.当你真正想要的是使用0,1 ,2和3(“aceg”)。

解决方案是在偶数键的两个for循环中为条件添加1 ... 这也将解决您未能告诉我们的关于此问题的异常情况!

只是一个谨慎的说明:我相信我的“解决方案”会导致你的偶数长度失败,但做功课不是我的工作。 :)