2015-10-11 6 views
0

Я прочитал текстовый файл и посчитал вхождения каждой буквы в этом файле. Я напечатал наиболее повторяющееся письмо со счетом в порядке убывания. Я хочу заменить повторяющееся письмо на другое письмо и записать обратно в выходной файл. Я попытался заменить повторенное на другое письмо символом или строковым массивом, но я не знаю, в чем проблема. Кто-нибудь может мне помочь, пожалуйста. СпасибоЧтение из текстового файла и его запись

+0

Можете ли вы объяснить, ваш код немного больше? Как добавить комментарии? – Nivedita

+0

Mr.Nivedita добавил комментарии к коду. –

+0

m a girl: P (filler) – Nivedita

ответ

0

Попытка разбить простой код путем сравнения частот букв - это итеративный подход, когда вы начинаете с порядка «e», «t», «a», «o», «i», «n», 's', 'h', 'r', ... характеристическое распределение для английского языка. Обычно это не будет относительный порядок букв в коротком тексте. Таким образом, не ожидайте получения ожидаемого результата с первой попытки - вам придется изменить таблицу переводов в соответствии с предположениями на основе первого результата, повторного запуска, угадывания снова и т. Д.

Вот метод count, переписанный для возврата массива, который связывает букву ('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']]); 
} 
+0

Привет, господин Лаун, я получаю несколько слов в сочетании с другими словами вроде этого ** questionsit righttime beabsorbed ** .. Также я хотел написать в новый файл письмо и ключ (письмо), который заменяется. ** U -> e, V-> t ** (буква и ключ) .. как я могу записать его в новый файл. –

+0

a => v b => i с => г д => у е => с е => п г => г ч => б я => F J => р к => ч л => и m => q n => m o => k p => r q => d г => т с => с т => а и => е v => т ш => л х => о у => х г => ш а => v b => i c => g d => y Выходной файл такой же, как и для таблицы перевода Mr.laune –

Смежные вопросы