Javafx-【直方圖】文字頻次統計工具 中文/英文單詞統計

01kkkrill發表於2021-11-09

上週倒騰了下 javafx,本來是做平時成績系統。跟老師提了一下 javafx,他突然興起,發了個統計中文和英文單詞並以直方圖顯示的實驗......只給兩三天的期限,笑著說考驗我們的潛力SOS,於是帶著組裡一共三人花了一天半時間做了下來。

主要介面如下

沒選文字時,如果沒勾選完就點開始分析會顯示提示

image

分析文字文件

image

只有一個功能,就是選擇本地 .txt 檔案,選擇文字語言和最低頻次,然後顯示直方圖統計結果。
試了下大的 .txt 文件,超出介面後面的就無法顯示,x軸和柱形條對不齊,還沒改這個bug,目前想著是新增拉條,但感覺看起來也不方便。
image
更希望能做成水平直方圖,貌似 javafx 封裝的 BarChart 把 x 軸和 y 軸能放的資料型別固定了。在 Youtube 看到有自己封裝BarChart,很不錯!(plus 上面好多javafx UI 介面也很絕!
因為時間很緊急,然後也是初學,程式碼慘不忍睹,Java 功底不紮實,Javafx 控制元件使用也一知半解。放些主要功能的實現程式碼
篩選出中英文都用的正規表示式!!! 只是對英文那個 's 會有問題,因為 ' 那也分割了,暫時不知道怎麼改,下面是程式碼

public static void Analysis(String flag) throws IOException
    {
        int bufferSize = 20 * 1024 * 1024;
        File file = new File(AnalysisFile);
        FileInputStream fileInputStream = new FileInputStream(file);
        BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
        InputStreamReader inputStreamReader = new InputStreamReader(bufferedInputStream);
        BufferedReader input = new BufferedReader(inputStreamReader, bufferSize);
        String line;
        while((line = input.readLine()) != null) {
            if(flag == "英文") { // Combox 那選擇中英文帶過來的引數 flag
                String[] str = line.split("\\W"); // 使用正規表示式以非字母,數字,下劃線的符號分割
                for(String e : str) {
                    if(e.matches("[a-z]+")) { // 篩選出英文單詞
                        if(sumOfWords.containsKey(e)) {
                            int num = sumOfWords.get(e);
                            sumOfWords.put(e, num + 1);
                        }
                        else sumOfWords.put(e, 1);
                    }
                }
            }
            else if(flag == "中文") {
                String d;
                char[] charArray = line.toCharArray(); //將字串轉換為字元陣列
                for(int x = 0;x < charArray.length;x++) { //迴圈遍歷字元陣列
                    d=Character.toString(charArray[x]); //返回一個字串物件
                    if (d.matches("[\\u4e00-\\u9fa5]")) {//判斷是否為漢字
                        if(!sumOfChinese.containsKey(charArray[x])) {
                            sumOfChinese.put(charArray[x], 1);
                        } else {
                            sumOfChinese.put(charArray[x],sumOfChinese.get(charArray[x])+1);
                        }
                    }
                }
            }
        }
        input.close();

點選選擇檔案時,開啟本地檔案選擇器的程式碼

    @FXML
    void choosefile(ActionEvent event) {
        Stage primaryStage = new Stage();
        FileChooser fileChooser = new FileChooser();
        FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("TXT files (*.txt)", "*.txt");
        fileChooser.getExtensionFilters().add(extFilter);
        File file = fileChooser.showOpenDialog(primaryStage);
        if(file != null) {
            FileInputField.setText(file.getAbsolutePath());
            AnalysisFile = String.valueOf(file);
            TipLabel.setText("");
        }
    }

最後提交前本來想打包成 .exe 檔案,控制檯用jdk裡packager打包出現亂碼,解決過程中想到,這是個仍有bug並且沒什麼作用的工具,隨即放棄打包。之後有時間重新寫一下,修正 bug 後加些功能就會上傳到 github,組裡取名Useless Tool,所以只能說供初學者參考了
12月份還得交學生平時成績管理系統那個專案,比較麻煩,三種參與者,十個活動。設計資料庫都想了好久(資料庫還沒看到設計那章,只能自己瞎設計。這個專案做下來也會上傳!在這之前還需要多看看java和資料庫,規範下類的設計和資料庫設計,不至於程式碼寫的:/自己都不想再看第二眼

相關文章