从文本文件中读取并写入

时间:2015-10-11 05:32:18

标签: java string character replaceall

我已阅读文本文件并计算该文件中每个字母的出现次数。我按照降序打印了最重复的字母。我想用另一个字母替换重复的字母并写回输出文件。我尝试用char或string数组中的另一个字母替换重复但我不知道问题是什么。谁能帮帮我吗。谢谢

1 个答案:

答案 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']] );
}