【发布时间】:2018-03-22 13:11:39
【问题描述】:
我编写了一个程序来加密和解密使用四方密码读取的文件。目前,我将文件存储到一个字符数组中,将其传递给一个将其分解为二元组的函数,并使用另一个函数中的嵌套 for 循环对其进行加密。在这一点上,我基本上是在尝试优化运行时间。是否有另一种方法来遍历我正在使用的二维数组,它不使用两个 for 循环,或者最多只使用一个 for 循环?下面是相关代码:
FileHandler.java
import java.io.*;
import java.util.*;
public class FileHandler {
private List<String> characters = new ArrayList<String>();
public char fileToChar[];
public void preEncryptionFile(String fileText) throws IOException {
String line;
FileInputStream fileReader = new FileInputStream(fileText);
DataInputStream dataInputStream = new DataInputStream(fileReader);
BufferedReader bufferedReader =
new BufferedReader(new InputStreamReader(dataInputStream));
while ((line = bufferedReader.readLine()) != null) {
characters.add(line);
}
String charsToString = characters.toString();
charsToString = charsToString.replaceAll("[^a-zA-Z]", "").toUpperCase();
fileToChar = charsToString.toCharArray();
bufferedReader.close();
}
}
FourSquareCipher.java
import java.util.*;
public class FourSquareCipher {
List<Character> encryptionList = new ArrayList<Character>();
List<Character> decryptionList = new ArrayList<Character>();
private 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' } };
public void encryptionBigram(char[] fileToText) {
int i;
char x, y;
for (i = 0; i < fileToText.length - 1; i += 2) {
x = fileToText[i];
y = fileToText[i + 1];
encryption(x, y);
}
}
private void encryption(char x, char y) {
int i, j;
int a, b, c, d;
a = b = c = d = 0;
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
if (x == matrix[i][j]) {
a = i;
b = j;
}
}
}
for (i = 5; i < 10; i++) {
for (j = 5; j < 10; j++) {
if (y == matrix[i][j]) {
c = i;
d = j;
}
}
}
encryptionList.add(matrix[a][d]);
encryptionList.add(matrix[c][b]);
}
}
【问题讨论】:
-
@DanielGale 我阅读它的方式 OP 正在使用该正则表达式删除任何非 alpha 内容。
-
List.toString()是不是将字符串列表加入一个字符串的正确方法。考虑使用例如StringUtils.join()来自 Apache Commons Lang。 -
你正在做 3 个循环。对于您的 encryptionBigram 中的流,这可能是一个很好的用例。这样,流 api 可以在多个线程上执行加密。此外,您可能希望将数组展平为一维,以便您可以使用一个 for 循环进行迭代。 softwareengineering.stackexchange.com/questions/212808/…
-
您应该在设置值之后添加一个
break,一旦您遇到该值,您就可以停止循环。 (基本上减少了过多的评估) -
Dont' ;) 这是一个容易犯的错误。也有人会说我错了。有些案例可能是“基于上下文”的,所以请拭目以待,看看是否有更多分享我的想法