簡體   English   中英

字母頻率排序數組

[英]Sorting array of letter frequency

我正在編寫一個程序,該程序計算文件的字母頻率,最終用於幫助解碼其他文件。 我能夠按值正確地對數組排序(我注釋掉的方法調用),但無法弄清楚如何用值對相應字母排序。 任何幫助將不勝感激。

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();
    }
}

如果我了解您的最終目標,則認為您不需要對已有的數組進行排序。 您必須重新考慮的第一件事是這個。 您是否真的需要對這個數組進行排序,即您在訓練文本中出現的字符的頻率?

同樣,如果我理解正確,那么您的訓練數組類似於以下內容:

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

現在,在目標文件中,您將再次收集一個像這樣的數組,但是這次,例如索引0將具有最大的數字,例如:

// target array:
// [8, 2, 2, 3, 1]

現在您要做的就是將目標文件中的所有字符a替換為e (因為您發現頻率最高,並且在訓練中頻率最高是e )。

為什么甚至需要對訓練數組進行排序?

如果我理解的不對,可以使用Map來保存您的頻率值,並查找該類中可能需要的任何功能:

Map<Character, Integer> characterFrequency = new HashMap<>();
characterFrequency.put('a', 4);
characterFrequency.put('b', 2);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM