这个程序的目的是“加密”关键字 - 关键字是用户输入 - 一次取两个字母(来自关键字),将这两个字母放在某些象限中,并基本上用来自的字母交换它们另外两个象限。我已经声明了一个名为matrix
的二维数组。此阵列中有四个不同的象限(5 x 5) - 两个象限(左上角和右下角)按顺序包含字母A - Z(不包括J)。另外两个象限(右上角和左下角)以无序方式包含字母A-Z(同样,不包括J)。该程序基本上是用于接收关键字并一次迭代两个字符。这是通过for循环完成的:
for (bytegram = 0; bytegram < length; bytegram += 2) {
x = keyword1.toUpperCase().charAt(bytegram);
y = keyword1.toUpperCase().charAt(bytegram + 1);
}
一旦完成此操作,它将在左上和右下象限中找到相应的字母,然后将它们与右上角和左下象限中的相应字母交换。例如,假设用户输入了关键字 “而不是” 。它首先处理 “th” ,因为它一次遍历关键字两个字符。它会在左上象限中找到字母 “t” ,并在其中找到字母 “h” 右下象限。要加密这两个字母,它基本上会交换 “t” 和 “h” 所在的列in并转到同一行,但这次是在右上角和左下角,如下:
两个顶部象限彼此对应,并且两个底部象限彼此对应。按照这种逻辑,输出(加密)将是 “ES” ,如图所示。
我无法打印出关键字的加密功能。该程序能够接收一个关键字,使用字符数组将其拆分为字符,并一次迭代两个字符(使用上面的for循环)。在for循环之下,还有另外两个for循环,用于处理交换字母的逻辑。目前,我仍然坚持使用什么类型的列表:
list[counter] = matrix[a][d];
counter++;
list[counter] = matrix[c][b];
counter++;
“a” 和 “b” 与左上和右下象限对应,< strong> “c” 和 “d” 分别对应右上角和左下角。
我试过 ArrayList&lt;字符&gt; list = new ArrayList&lt;字符&gt;() 和 列表&lt;字符&gt; list = new ArrayList&lt;字符&gt;() 。无论我使用哪一个,我都会收到错误:
表达式的类型必须是数组类型,但它解析为 ArrayList的
以下是我的代码:
import java.awt.List;
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
public class FourSquareCipher {
public static void main(String[] args) throws IOException {
ArrayList<Character> list = new ArrayList<Character>();
char[][] matrix = {
{ 'A', 'B', 'C', 'D', 'E', 'Z', 'G', 'P', 'T', 'F' },
{ 'F', 'G', 'H', 'I', 'K', 'O', 'I', 'H', 'M', 'U' },
{ 'L', 'M', 'N', 'O', 'P', 'W', 'D', 'R', 'C', 'N' },
{ 'Q', 'R', 'S', 'T', 'U', 'Y', 'K', 'E', 'Q', 'A' },
{ 'V', 'W', 'X', 'Y', 'Z', 'X', 'V', 'S', 'B', 'L' },
{ 'M', 'F', 'N', 'B', 'D', 'A', 'B', 'C', 'D', 'E' },
{ 'C', 'R', 'H', 'S', 'A', 'F', 'G', 'H', 'I', 'K' },
{ 'X', 'Y', 'O', 'G', 'V', 'L', 'M', 'N', 'O', 'P' },
{ 'I', 'T', 'U', 'E', 'W', 'Q', 'R', 'S', 'T', 'U' },
{ 'L', 'Q', 'Z', 'K', 'P', 'V', 'W', 'X', 'Y', 'Z' }
};
String fileName = "keywords.txt";
String line = null;
String keyword1;
int length;
int bytegram;
int a, b, c, d;
int i, j;
int counter;
char x = 0, y = 0;
long startTime = System.currentTimeMillis();
long startTimeSeconds = TimeUnit.MILLISECONDS.toSeconds(startTime);
FileReader fileReader = new FileReader(fileName);
BufferedReader bufferedReader = new BufferedReader(fileReader);
@SuppressWarnings("resource")
Scanner keywordInput = new Scanner(System.in);
System.out.println("Enter the first keyword: ");
keyword1 = keywordInput.nextLine();
length = keyword1.length();
char[] words = keyword1.toUpperCase().toCharArray();
for (char letter:words) {
System.out.println(letter);
}
for (bytegram = 0; bytegram < length; bytegram += 2) {
x = keyword1.toUpperCase().charAt(bytegram);
y = keyword1.toUpperCase().charAt(bytegram + 1);
}
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
if (matrix[i][j] == x && i < 5 && j < 5) {
a = i;
b = j;
}
}
}
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++) {
if (matrix[i][j] == y && i > 4 && j > 4) {
c = i;
d = j;
}
}
}
list[counter] = matrix[a][d];
counter++;
list[counter] = matrix[c][b];
counter++;
while ((line = bufferedReader.readLine()) != null) {
char[] fileToChar = line.toUpperCase().toCharArray();
for (char fileArray:fileToChar) {
System.out.println(fileArray);
}
}
System.out.println("Encryption time (s): " + ((System.currentTimeMillis() - startTimeSeconds) / 1000000000 / 1000));
bufferedReader.close();
}
}
答案 0 :(得分:1)
是的,它会抛出错误,因为,
list:java.util.ArrayList NOT EQUAL matrix:char [] []