字母频率排序数组

时间:2018-11-25 01:44:27

标签: java drjava

我正在编写一个程序,该程序计算文件的字母频率,最终用于帮助解码其他文件。我能够按值正确地对数组排序(我注释掉的方法调用),但无法弄清楚如何用值对相应字母排序。任何帮助将不胜感激。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

class CodeBreakerProject {

    public static void swap(int[] count, int index1, int index2) {
        int temp = count[index1];
        count[index1] = count[index2];
        count[index2] = temp;
    }

    public static void selectionSort(int[] count) {
        for (int i = 0; i < count.length; i++) {
            // find smallest element from i to end
            int minIndex = i; // assume 1st element is smallest
            for (int j = i; j < count.length; j++) {
                if (count[j] > count[minIndex]) {
                    minIndex = j;
                }
            }
            swap(count, i, minIndex);
        }
    }

    public static void main(String[] args) throws IOException {
        File file1 = new File("training.txt");
        BufferedReader in = new BufferedReader(new FileReader(file1));
        System.out.println("Letter Frequency");

        int nextChar;
        char ch;

        int[] count = new int[26];

        while ((nextChar = in.read()) != -1) {
            ch = ((char) nextChar);
            if (ch >= 'a' && ch <= 'z') { count[ch - 'a']++; }
        }

        //selectionSort(count); this sorts the values but does not move the letter assignments

        for (int i = 0; i < 26; i++) {
            System.out.printf("%c = %d\n", i + 'A', count[i]);

        }

        in.close();
    }
}

1 个答案:

答案 0 :(得分:1)

如果我了解您的最终目标,则认为您不需要对现有数组进行排序。您必须重新考虑的第一件事是这个。您是否真的需要对这个数组进行排序,即您在训练文本中出现的字符的频率?

如果我理解正确的话,你的训练数组也类似这样:

<div class="row">

现在,在目标文件中,您将再次收集一个像这样的数组,但是这次,例如索引0将具有最大的数字,例如:

int[] training = new int[5];

training[0] = 1; // a
training[1] = 2; // b
training[2] = 3; // c
training[3] = 2; // d
training[4] = 8; // e

现在您要做的就是将目标文件中的所有字符// target array: // [8, 2, 2, 3, 1] 替换为a。 (因为您发现频率最高,而在训练中频率最高的是字母e。)

为什么您甚至需要对训练数组进行排序?

如果我理解的不对,请使用e来保存您的频率值,并查找该类中可能需要的任何功能:

Map