WC Java実装

4024 ワード

プロジェクトgithubアドレス
一.実現状況
基本的な要件
  • c統計ファイル文字数(実装)
  • w統計ファイル語数(実装)
  • l統計ファイル行数(実装)
  • 拡張機能
  • s再帰処理ディレクトリの下で条件を満たすファイル(実装)
  • aは、ファイルコード行/空行/注釈行(実装)
  • を返す.
    高度な機能
  • xグラフィックスインタフェース(未実装)
  •   
    二.問題を解く構想
    まずコマンドを解析し、コマンド変数とファイルアドレス変数を取得する必要があります.コマンドの種類に応じて、ファイルを個別に処理します.
    基本的ないくつかのコマンドは、正規表現または簡単な方法で呼び出すことで結果を計算します.
    一方,sコマンドは他のコマンドとは異なり,2つのコマンドを同時に解析し,ファイルディレクトリを処理し,必要に応じたファイルを取得して処理するとともに,正規表現でワイルドカードを処理する必要がある.
    三.設計実現過程
    コードには主に2つのクラス、マスタークラス、関数インタフェースクラスが含まれています.
    トピッククラスにはmianメソッドと主要なビジネスロジックコードが含まれています.関数インタフェースクラスは、各コマンドが必要に応じて論理コードを直接実現できるように、テンプレートメソッドモードを実現するために使用され、コードの拡張性を向上させ、コード量を削減します.
    四.コード説明
    入力したコマンドをループして取得し,コマンドフォーマットが正しいか否かを判断し,コマンド解析方法に進む.
    while (scan.hasNextLine()) {
        String[] commandArray = scan.nextLine().trim().split("\\s+");
        if ("wc.exe".equals(commandArray[0])) {
            processFile(commandArray);
        } else {
            System.out.println("    !");
        }
    }

    sコマンドであるか否かを判断すると、sコマンド処理方法に進み、逆に現在のコマンドに基づいてデータを処理する
    static void processFile(String[] command) {
        if ("-s".equals(command[1])) {
            processDirectory(command);
            return;
        }
        if (command.length > 3) {
            System.out.println("    !");
            return;
        }
        if ("-c".equals(command[1])) {
            calculate(command[2], (BufferedReader reader) ->
                        System.out.println("   :" + reader.lines()
                                .map(s -> s.replaceAll(" ", ""))
                                .mapToInt(String::length)
                                .sum())
            );
        } else if ("-w".equals(command[1])) {
            ...
        } else if ("-l".equals(command[1])) {
            ...
        } else if ("-a".equals(command[1])) {
            ...
        } else {
            System.out.println("    !");
        }
    }

    sコマンドを処理する場合、processDirectoryメソッドでデータを処理し、ワイルドカードマッチングと要求に合致するファイルアドレスの収集を行う
    private static void processDirectory(String[] command) {
            if (command.length < 4) {
                System.out.println("    !");
                return;
            }
            String address = command[3];
            //        
            String fileName = address.substring(address.lastIndexOf("\\") + 1);
            //    
            File file = new File(address.substring(0, address.lastIndexOf("\\")));
            //     
            Pattern p = Pattern.compile(fileName.replace(".", "\\.")
                    .replace("*", ".*")
                    .replace("?", ".?"));
            //                
            List filePaths = getAllFilePaths(file, new ArrayList<>());
            //       
            filePaths = filePaths.stream()
                    .filter(f -> p.matcher(f.substring(f.lastIndexOf("\\") + 1)).matches())
                    .collect(toList());
            if (!filePaths.isEmpty()) {
                for (String filePath : filePaths) {
                    System.out.println(filePath);
                    processFile(new String[]{"", command[2], filePath});
                }
            } else {
                System.out.println("          !");
            }
        }

    calculateはProcessFile関数インタフェースをパラメータとし,上位コードは論理コードをパラメータとして直接伝達できる.
    private static void calculate(String fileAddress, ProcessFile processFile) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader(fileAddress));
            processFile.process(reader);
        } catch (FileNotFoundException e) {
            System.out.println("        !");
        }
    }
    @FunctionalInterface
    interface ProcessFile {
        void process(BufferedReader reader);
    }

    五.テスト運転
    テストファイル:テスト結果:
    六.P 2 P表
    七.項目まとめ
    今回のプロジェクトはソフトウェアエンジニアリングの思想を利用して、プロジェクトの中のすべてのステップに対して真剣に考えて、时间を考虑して予想して、全体のプロジェクトの実践の下で収获が多くて、初めの时に需要に対する考量が十分ではありませんて、コードの绝えず修正をもたらして、次回教訓を吸収することができることを望みます