我对我编写的程序正在输出的内容感到非常困惑。该程序的目的是解码/编码为一种名为Caesar Shift的代码,它基本上只取一个单词/句子的每个字母,并通过一个" shift键"将它移到右边。 (例如ab,换档键1 = bc)。
我设置了程序,以便它向用户询问加密/解密,然后是要编码/解码的消息,然后是移位键。我的编码/解码功能也遇到了同样的问题。我会专注于这个问题的编码,因为它们几乎是一样的。
基本上,我设置了编码功能,以便它接受String消息和int ShiftKey的参数。我有一个消息的每个字母的字符串数组。我的计划是遍历数组/单词中的每个字母,在字母表中找到它的当前索引,并将shift键添加到它,它存储在int finalIndex中。我在索引finalIndex附加字母表的字母,最后打印出单词。
public static void encode(String message, int shiftKey)
{
String [] array = message.split("");
String encoded = "";
for (String a : array)
{
int finalIndex;
int index = alphabet.indexOf(a);
finalIndex = index + shiftKey;
encoded += alphabet.charAt(finalIndex);
}
System.out.println(encoded);
}
问题在于,当我运行程序时,输出是正确的,除了在编码短语的开头,输出总是有一个额外的字母,它是shiftKey上字母的索引。 例如,如果我输入消息" hi",使用shift键1,则输出" bij",因为b是索引1处的字母表,hi只是预期的班次。
我已经尝试了一切,但我无法弄清楚为什么会发生这种情况。我确定这个功能有问题,而不是其他任何地方,因为我试图隔离不同的区域以查看问题所在。
非常感谢任何帮助。感谢。
完整代码
import java.util.*;
import java.io.*;
public class CaesarShiftTester
{
public static void main (String[] args)
{
boolean running = true;
while (running){
Scanner in = new Scanner (System.in);
System.out.println("Encryption or Decryption? (E/D): " );
String answer = in.next();
if (answer.equalsIgnoreCase("e"))
{
System.out.println("Enter message: ");
String message = in.next();
System.out.println("Enter Shift Key: " );
int shiftKey = in.nextInt();
CaesarShiftEncryption.encode(message, shiftKey);
System.out.println("Quit? (Y/N): ");
String again = in.next();
if (again.equalsIgnoreCase("Y"))
running = false;
else
running = true;
}
else if (answer.equalsIgnoreCase("d"))
{
System.out.println("Enter message: ");
String message = in.next();
System.out.println("Enter Shift Key: " );
int shiftKey = in.nextInt();
CaesarShiftEncryption.decode(message, shiftKey);
System.out.println("Quit? (Y/N): ");
String again = in.next();
if (again.equalsIgnoreCase("Y"))
running = false;
else
running = true;
}
}
}
}
\
import java.io.*;
import java.util.*;
public class CaesarShiftEncryption
{
private static final String alphabet = "abcdefghijklmnopqrstuvwxyz";
public static void encode(String message, int shiftKey)
{
String [] array = message.split("");
String encoded = "";
for (String a : array)
{
System.out.println(a);
int finalIndex;
int index = alphabet.indexOf(a);
finalIndex = index + shiftKey;
System.out.println(finalIndex);
encoded += alphabet.charAt(finalIndex);
}
System.out.println(encoded);
}
public static void decode(String message, int shiftKey)
{
char shifted;
String encoded = "";
for (int i = 0; i < message.length(); i ++)
{
char nextChar = message.charAt(i);
shifted = (char)(nextChar - shiftKey);
encoded += shifted;
}
System.out.println("Encoded: " + encoded);
}
}
答案 0 :(得分:2)
JDK问题。
考虑使用JDK 8 ..
在JDK 7上,如果你执行split(“”),则split函数会在开头添加一个额外的元素。
如果无法更新,可以使用char [],或者只跳过第一个(将增强的for循环更改为传统的循环)
我测试了你的代码并且工作正常..这就是为什么如此令人困惑..然后我将JDK更改为版本7,并且遇到了和你一样的问题。
答案 1 :(得分:1)
问题在于您使用message.split("")
功能。它在数组中添加了一个空元素。
以下代码有效。
public class test {
public static void main (String args[])
{
char[] array = "ab".toCharArray();
String alphabet = "abc";
String encoded = "";
int shiftKey = 1;
for (char a : array)
{
int finalIndex;
int index = alphabet.indexOf(a);
finalIndex = index + shiftKey;
encoded += alphabet.charAt(finalIndex);
}
System.out.println(encoded);
}
}
同样使用toCartArray()方法更适合此用例。