我已阅读文本文件并计算该文件中每个字母的出现次数。我按照降序打印了最重复的字母。我想用另一个字母替换重复的字母并写回输出文件。我尝试用char或string数组中的另一个字母替换重复但我不知道问题是什么。谁能帮帮我吗。谢谢
答案 0 :(得分:0)
尝试通过比较字母频率来破解简单代码是一种迭代方法,您可以从“e”,“t”,“a”,“o”,“i”,“n”,“s”开始,'h','r',...英语的特征分布。通常这不是短文中字母的相对顺序。因此,不要期望在第一次尝试时收到预期的输出 - 你必须根据第一个结果的猜测修改转换表,重新运行,再次猜测等等。
这是方法计数,重写为返回一个数组,该数组将字母('a'== 0,'b'== 1,...)与按频率排序的字母表中的位置相关联。
public int[] load() throws IOException {
File fp = new File("realtext.txt");
BufferedReader in = new BufferedReader(new FileReader(fp));
int[] count = new int[26];
int nextChar;
while ((nextChar = in.read()) != -1) {
int ch = ((char) nextChar);
if (ch >= 'a' && ch <= 'z') {
count[ch - 'a']++;
}
}
int[] position = new int[count.length];
for (int k = 0; k < 26; k++) {
position[k] = k;
}
for (int k = 0; k < 26; k++) {
int max = count[k];
int maxpos = k;
for (int l = k + 1; l < 26; l++) {
if( count[l] > max ){
max = count[l];
maxpos = l;
}
}
int h = count[k];
count[k] = count[maxpos];
count[maxpos] = h;
h = position[k];
position[k] = position[maxpos];
position[maxpos] = h;
}
int trans[] = new int[position.length];
System.out.println("Descending order");
for (int k = 0; k < 26; k++) {
trans[position[k]] = k;
System.out.printf("%c = %d -> %d-th\n",
position[k] + 'A', count[k], k);
}
return trans;
}
替换方法使用此数组:
public void replacing(int[] trans) throws IOException {
File fp = new File("ciphertext1.txt");
BufferedReader in = new BufferedReader(new FileReader(fp));
char[] s = {'e', 't', 'a', 'o', 'i', 'h', 's', 'n', 'd', 'r',
'l', 'c', 'u', 'm', 'w', 'f', 'g', 'y', 'p', 'b',
'v', 'k', 'j', 'x', 'q', 'z'};
String line;
while ((line = in.readLine()) != null) {
StringBuilder sb = new StringBuilder();
for( int i = 0; i < line.length(); ++i ){
char c = line.charAt(i);
if( 'a' <= c && c <= 'z' ){
sb.append( s[trans[c-'a']] );
} else {
sb.append( c );
}
}
System.out.println( sb.toString() );
}
in.close();
}
要写入文件,请使用
File outfp = new File("decoded.txt");
PrintWriter out = new PrintWriter(new FileWriter(outfp));
...
out.println( sb.toString() );
...
out.close();
要转储转换表,请使用
for( char c = 'a'; c <= 'z'; ++c ){
out.println( c + " => " + s[trans[c-'a']] );
}