0

ソースファイルのコード行をカウントするアプリケーションを開発しようとしていました。

package asd;
    public class abv {
        /**
         * @param args
         */
        public static void main(String[] args) {
    // comment
    /* comment*/
        }
    }

以下はコードの一部です.....

 private static int totalLineCount = 0;
    private static int totalFileScannedCount = 0;

    public static void main(final String[] args) throws Exception {

        JFileChooser chooser = new JFileChooser();
        chooser.setCurrentDirectory(new java.io.File("C:" + File.separator));
        chooser.setDialogTitle("FILES ALONG WITH LINE NUMBERS");
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        chooser.setAcceptAllFileFilterUsed(false);
        if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
            Map<File, Integer> result = new HashMap<File, Integer>();
            File directory = new File(chooser.getSelectedFile().getAbsolutePath());

            List<File> files = getFileListing(directory);

            // print out all file names, in the the order of File.compareTo()
            for (File file : files) {
               // System.out.println("Directory: " + file);
                getFileLineCount(result, file);
                //totalFileScannedCount += result.size(); //saral
            }

            System.out.println("*****************************************");
            System.out.println("FILE NAME FOLLOWED BY LOC");
            System.out.println("*****************************************");

            for (Map.Entry<File, Integer> entry : result.entrySet()) {
                System.out.println(entry.getKey().getAbsolutePath() + " ==> " + entry.getValue());
            }
            System.out.println("*****************************************");
            System.out.println("SUM OF FILES SCANNED ==>" + "\t" + totalFileScannedCount);
            System.out.println("SUM OF ALL THE LINES ==>" + "\t" + totalLineCount);
        }

    }


    public static void getFileLineCount(final Map<File, Integer> result, final File directory)
            throws FileNotFoundException {
        File[] files = directory.listFiles(new FilenameFilter() {

            public boolean accept(final File directory, final String name) {
                if (name.endsWith(".java")) {
                    return true;
                } else {
                    return false;
                }
            }
        });
        for (File file : files) {
            if (file.isFile()) {
                Scanner scanner = new Scanner(new FileReader(file));
                int lineCount = 0;
                totalFileScannedCount ++; //saral
                try {

                    /*for (lineCount = 0; scanner.nextLine() != null;lineCount++ ) { //saral
                        ;


                    }*/


                    while (scanner.hasNextLine()) {
                           String line = scanner.nextLine().trim();
                           if (!line.isEmpty()) {
                              System.out.println("debug-->"+line); // to debug cross checked that no whitespaces are there 
                             lineCount++;
                           }
                    }

                     result.put(file, lineCount);
                     totalLineCount += lineCount;                               
                } catch (NoSuchElementException e) {
                    // e.printStackTrace();
                }
            }
        }

    }

    /**
     * Recursively walk a directory tree and return a List of all Files found;
     * the List is sorted using File.compareTo().
     * 
     * @param aStartingDir
     *            is a valid directory, which can be read.
     */
    static public List<File> getFileListing(final File aStartingDir) throws FileNotFoundException {
        validateDirectory(aStartingDir);
        List<File> result = getFileListingNoSort(aStartingDir);
        Collections.sort(result);
        return result;
    }

    // PRIVATE //
    static private List<File> getFileListingNoSort(final File aStartingDir) throws FileNotFoundException {
        List<File> result = new ArrayList<File>();
        File[] filesAndDirs = aStartingDir.listFiles();
        List<File> filesDirs = Arrays.asList(filesAndDirs);
        for (File file : filesDirs) {
            if (file.isDirectory()) {
                result.add(file);
            }
            if (!file.isFile()) {
                // must be a directory
                // recursive call!
                List<File> deeperList = getFileListingNoSort(file);
                result.addAll(deeperList);
            }
        }
        return result;
    }

    /**
     * Directory is valid if it exists, does not represent a file, and can be
     * read.
     */
    static private void validateDirectory(final File aDirectory) throws FileNotFoundException {
        if (aDirectory == null) {
            throw new IllegalArgumentException("Directory should not be null.");
        }
        if (!aDirectory.exists()) {
            throw new FileNotFoundException("Directory does not exist: " + aDirectory);
        }
        if (!aDirectory.isDirectory()) {
            throw new IllegalArgumentException("Is not a directory: " + aDirectory);
        }
        if (!aDirectory.canRead()) {
            throw new IllegalArgumentException("Directory cannot be read: " + aDirectory);
        }
    }

今問題が来るのはそれです。プロジェクトフォルダを選択してコンソールで結果を確認すると、Javaファイルのコード行がカウントされますが、コメントもカウントされます。コメントもカウントされないようにします。つまり、コメントされた行はカウントされません。コード行として、コードの一部でどのような変更を行う必要があるかを教えてください...

以下は、私がコンソールで取得している出力です。

debug-->package asd;
debug-->public class abv {
debug-->/**
debug-->* @param args
debug-->*/
debug-->public static void main(String[] args) {
debug-->// comment
debug-->/* comment*/
debug-->}
debug-->}
*****************************************
FILE NAME FOLLOWED BY LOC
*****************************************
C:\Users\vaio\Desktop\Demo\fg\src\asd\abv.java ==> 10
*****************************************
SUM OF FILES SCANNED ==>    1
SUM OF ALL THE LINES ==>    10

コードの一部でどのような変更を行う必要があるかを教えてください...

4

2 に答える 2

1

これに対する私の最初の刺し傷は、正規表現を使用することです。ソースファイルがそれほど大きくならない場合は、行のセット全体を文字列に読み込み、すべてのコメントを何も置き換えない正規表現を実行してから、新しい文字列の行を数えることができます。

私のJavaは少し錆びていますが、これでうまくいくと思います(現在テストする環境がありません)。

int count = 0;
Scanner scanner = new Scanner(new File(file));
scanner.useDelimiter("\\Z");
String data = scanner.next();
String cleaned = data.replaceAll("/\\*(?:.|[\\n\\r])*?\\*/",""));
LineNumberReader lnr = new LineNumberReader(new StringReader(cleaned));
String line;
while ((line = lnr.readLine()) != null)
{
    String sline = line.trim();
    if(sline.isEmpty() == false)
        if(!(sline.length() > 2 && sline.charAt(0) == '/' && sline.charAt(1) == '/'))
            count += 1;
            //separated for clarity
}

これにより、すべてがコメントではない//行数がわかり、複数行のコメントも処理できるようになります。

コメントの正規表現のソース:正規表現のソース

于 2012-07-01T06:56:39.303 に答える
0

私の以前の答えは正しくありませんでした。あなたがそれを正しいとチェックしたので、私は@Trickfireのコードを使用して私の答えを編集しました。

while (scanner.hasNextLine()) {

                   scanner.useDelimiter("\\Z");
                   String data = scanner.next();
                   String cleaned = data.replaceAll("/\\*(?:.|[\\n\\r])*?\\*/",""));
                   LineNumberReader lnr = new LineNumberReader(new StringReader(cleaned));
                   String line;
                   while ((line = lnr.readLine()) != null)
                    {
                      String sline = line.trim();
                      if(sline.isEmpty() == false)
                      if(!(sline.length() > 2 && sline.charAt(0) == '/' && sline.charAt(1) == '/'))
                          lineCount += 1;
                           //separated for clarity
                   }


                }
于 2012-07-01T06:38:35.967 に答える