如何在循环中向下移动字母

时间:2015-10-15 20:29:08

标签: java

我试图创建一个只返回字母的循环。在我的代码中,我得到了我不想要的符号。如何修复我的循环,以便当我的整数为+3时,它只给我字母?

public static String caesarDecrypt(String encoded, int shift){
    String decrypted = "";

    for (int i = 0; i < encoded.length(); i++) {
        char t = encoded.charAt(i);

        if ((t <= 'a') && (t >= 'z')) {
            t -= shift;
        }

        if (t > 'z') {
            t += 26;
        } else if ((t >= 'A') && (t <= 'Z')) {
            t -= shift;

            if (t > 'Z') 
                t += 26;
        } else {

        }

        decrypted = decrypted + t;
    }
}

4 个答案:

答案 0 :(得分:1)

您正在从字母中减去移位值。因此,新信永远不会是> 'z'。您应该检查它是< 'a'(或分别为'A')。

StringBuilder decrypted = new StringBuilder(encoded.length());
for (int i = 0; i < encoded.length(); i++)
{
    char t = encoded.charAt(i);
    if ((t >= 'a') && (t <= 'z'))
    {
        t -= shift;
        while (t < 'a')
        {
            t += 26;
        }
    }
    else if ((t >= 'A') && (t <= 'Z'))
    {
        t -= shift;
        while (t < 'A')
        {
            t += 26;
        }
    }

    decrypted.append(t);
}
return decrypted.toString();

此外,您不应该使用字符串连接来生成结果。请改为了解StringBuilder

编辑 :为了确保新信件在'a' .. 'z'范围内,任意(正)班次,您应该使用while而不是if

答案 1 :(得分:0)

我没有给你确切的代码。但我可以用逻辑来帮助你:

  1. 检查您是否因换班而到达终点( a,A,z,Z )。
  2. 如果您以任何一种方式超过终点,则计算终点之间的距离并移动 t 。将距离加/减(基于终点)加到另一个端点以获得确切的字母。

答案 2 :(得分:0)

这样的东西? (警告,未经测试)

public static String caesarDecrypt(String encoded, int shift) {
    String decrypted = "";
    for (int i = 0; i < encoded.length(); i++) {
        char t = encoded.charAt(i).ToUpper();

        decrypted = decrypted + decode(t, shift);
    }
}


// call with uppercase ASCII letters, and a positive shift
function decode(char n, int shift)
{
   if ((n < 'A') || (n > 'Z')) return ('-');

   var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   var s = str.charAt(((n - 'A') + shift)%26);
   return(s);
}

答案 3 :(得分:0)

当你命名方法caesarDecrypt时(我假设你的意思是加密),我想你想要改变字母表,包括环绕。

此代码将为您执行此操作:

public class Snippet {
    public static void main(String[] args) {
        System.out.println(caesarShift("This is a Fizzy test.", 5));
        System.out.println(caesarShift("Ymnx nx f Kneed yjxy.", -5));
    }

    public static String caesarShift(String input, int shift) {
        // making sure that shift is positive so that modulo works correctly
        while (shift < 0)
            shift += 26;

        int l = input.length();
        StringBuffer output = new StringBuffer();

        for (int i = 0; i < l; i++) {
            char c = input.charAt(i);
            char newLetter = c;

            if (c >= 'a' && c <= 'z') { // lowercase
                newLetter = (char) ((c - 'a' + shift) % 26 + 'a'); // shift, wrap it and convert it back to char
            } else if (c >= 'A' && c <= 'Z') { // uppercase
                newLetter = (char) ((c - 'A' + shift) % 26 + 'A'); // shift, wrap it and convert it back to char
            }

            output.append(newLetter);
        }

        return output.toString();
    }
}

这将处理小写和大写字母。其他所有东西都会保留原样(如空格,标点符号等)。

请花一些时间查看此代码以了解其工作原理。我已经提出一些意见,以使其更清楚。从你的代码我觉得你有点困惑,所以你很好地理解这些代码是很重要的。如果您有任何疑问,请随时向他们询问。

此代码

String start = "abcdefghijklmnopqrstuvwxyz";
String encrypted = caesarShift(start, 3);
String decrypted = caesarShift(encrypted, -3);
System.out.println("Start     : " + start);
System.out.println("Encrypted : " + encrypted);
System.out.println("Decrypted : " + decrypted);

将给出此结果

Start     : abcdefghijklmnopqrstuvwxyz
Encrypted : defghijklmnopqrstuvwxyzabc
Decrypted : abcdefghijklmnopqrstuvwxyz