-1

私は、javaプロジェクト内のjavaパッケージにあるファイルの数を読み取り、それらの個々のファイルのコード行をカウントするアプリケーションを開発しました。たとえば、4つの個別ファイルを持つ2つのパッケージがある場合、合計ファイルが読み取られます。 4になり、各ファイルに10行のコードが含まれる4つのファイルの場合、プロジェクト全体で4*10は合計40行のコードになります...以下は私のコードです

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

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

            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; ) {
                            while (scanner.hasNextLine()) {
   String line = scanner.nextLine().trim();
   if (!line.isEmpty()) {
     lineCount++;
   }
                        }
                    } catch (NoSuchElementException e) {
                        result.put(file, lineCount);
                        totalLineCount += lineCount;
                    }
                }
            }

        }

        /**
         * 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);
            }
        }

ただし、問題は、個々のファイルのコード行を計算するときに空白行もカウントすることです。これはすべきではありません。計算中に空白をカウントしないように、プログラムでどのような変更を行う必要があるかを教えてください。個々のファイルのコード行。

私の頭に浮かんだアイデアは、読み取った文字列を ""と比較し、if(!readString.trim()。equals( ""))lineCount++のように""(空)と等しくない場合はカウントすることでした。

4

1 に答える 1

2

提案:

  • スキャナーにはhasNextLine()あなたが使うべき方法があります。whileループの条件として使用します。
  • 次に、ループ内で1回だけ呼び出すことにより、whileループ内の行を取得しnextLine()ます。
  • 読み込まれた文字列をもう一度呼び出しtrim()ます。最新のコード更新では、これに対するあなたの試みはまだわかりません。
  • 文字列でメソッドを呼び出すときの重要な概念は、それらが不変であり、呼び出されたメソッドが基になる文字列を変更せず、trim()違いがないことです。呼び出された文字列は変更されませんが、メソッドによって返される文字列変更され、実際にはトリミングされています。
  • 文字列には、文字列isEmpty()をトリミングした後に呼び出す必要のあるメソッドがあります。

だからしないでください:

try {
    for (lineCount = 0; scanner.nextLine() != null; ) {
        if(!readString.trim().equals("")) lineCount++; // updated one
    }
} catch (NoSuchElementException e) {
    result.put(file, lineCount);
    totalLineCount += lineCount;
}

代わりに:

int lineCount = 0;
while (scanner.hasNextLine()) {
   String line = scanner.nextLine().trim();
   if (!line.isEmpty()) {
     lineCount++;
   }
}
于 2012-07-01T04:34:32.020 に答える