我有一个关于获取加密文本文件内容并根据给定频率列表交换相应字母的快速问题。
例如,文本文件中的前几行是:
XWJGFBVCCVUJYPXQZGCVXQHXKAZGPVPUHBZJYPUVMFCZVYXQZWJFZJCCMVMGHWZBZXQZFKBKUBKAZGJY
我创建了一个单个字符的ArrayList,然后找到每个字母出现在HashSet文件中的次数。
A: 6
B: 35
C: 30
D: 21
F: 31
G: 38
H: 16
I: 1
J: 61
K: 53
L: 16
M: 26
N: 7
O: 3
P: 33
Q: 61
R: 10
S: 8
U: 21
V: 37
W: 23
X: 67
Y: 36
Z: 80
import java.io.*;
import java.util.*;
public class lab9 {
lab9() {
try {
String content = new Scanner(new File("Cipher.txt")).useDelimiter("\\Z").next();
String letters = content.replaceAll("\\W", "");
System.out.println(letters);
List < String > list = new ArrayList < String > (Arrays.asList(letters.split("")));
Set < String > unique = new HashSet < String > (list);
for (String key: unique) {
System.out.println(key + ": " + Collections.frequency(list, key));
}
String decipher = "ETAHOSINRDBLMWGUCYFJKVPXQZ";
List < String > list2 = new ArrayList < String > (Arrays.asList(decipher.split("")));
System.out.println(decipher);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在代码段中,您可以看到字符串解码,它是英语中最常用字母的降序排列。因此,我想在文本文件中将字母Z与E交换。这样做的有效方法是什么?
答案 0 :(得分:0)
这样做的一种方法是将字母 - 频率配对包装在Java对象中,表示字母频率。然后,您将为这些对象实现比较器,以根据频率对它们进行排序。对于预先建立的实际字母频率列表,您会做同样的事情,为您留下两个排序列表。
从这一点来看,一个有效的解决方案是在加密和解密的字母之间创建一个哈希映射,然后遍历字符串,用适当的值替换每个字符。这将为您提供消息的“解密”版本,但除非您有更多的加密文本可供使用,否则这种基于频率的直接翻译可能会出现一些错误。
这是在自定义对象上创建比较器的好答案: Sort ArrayList of custom Objects by property
答案 1 :(得分:0)
按降序对ArrayList进行排序。使用key = letter,value =在ArrayList中该字母的索引位置创建Dictionary / Hashtable。
从头开始逐字符(charRead)读取加密文本,并用解密替换每个字母[Hashtable [charRead]]
您需要将上面的伪代码更改为Java