在尝试交换二维数组中的元素时,我应该使用哪种类型的列表?

时间:2018-02-28 11:19:32

标签: java

这个程序的目的是“加密”关键字 - 关键字是用户输入 - 一次取两个字母(来自关键字),将这两个字母放在某些象限中,并基本上用来自的字母交换它们另外两个象限。我已经声明了一个名为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并转到同一行,但这次是在右上角和左下角,如下:

Encryption example

两个顶部象限彼此对应,并且两个底部象限彼此对应。按照这种逻辑,输出(加密)将是 “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();
    }
}

1 个答案:

答案 0 :(得分:1)

是的,它会抛出错误,因为,

  

list:java.util.ArrayList NOT EQUAL matrix:char [] []