2012-07-01 100 views
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 

請指教一下修改需在這段代碼中完成...

回答

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 
        } 


       } 
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 
} 

這應該給你,是不是所有的註釋行數/ /並處理多行註釋。

來源正則表達式意見:Regex source

+0

好的,你在說什麼是正確的。 –