2011-08-10 77 views
0

可執行行我寫了掃描,發現代碼的可執行行(ELOC),僅用於Java和C++代碼的代碼(BLOC)和評論(CLOC)的空行的Java程序。以下是我的代碼:爪哇 - 算法找到的代碼

if(extension.contains("java") || extension.contains("c++")) 
       { 
        Scanner input = new Scanner(fileObject); 
        while(input.hasNext()) 
        { 
         String s = input.nextLine(); 
         if(s.length()==0) 
         { 
          bloc++; 
         } 
         else if(s.contains("/*") || s.startsWith("/*")) 
         { 
          cloc++; 
          while(!s.contains("*/")) 
          { 
           cloc++; 
           s = input.nextLine(); 
          } 
         } 
         else if(s.contains("//")) 
         { 
          cloc++; 
         } 
         else 
         { 
          eloc++; 
         } 
        }//while 
        System.out.println("ELOC: "+(eloc)); 
        System.out.println("Blank Lines: "+bloc); 
        System.out.println("Comment Lines: "+cloc); 
       } 

我跑不同的Java和C++源代碼,但它並不總是給出正確的答案。我能做些什麼來改善它?有什麼我可以使用的在線Java代碼?

對於這個問題,我只計算代碼的可執行線。如果一行如下所示:

int x=0;//some comment 

那麼上面的行應該被計爲一個可執行行。以下是我的更新代碼:

String extension=getExtension(fileObject.getName()); 
      if(extension.contains("java") || extension.contains("c++")) 
      {   
       Scanner input = new Scanner(fileObject); 
       String s; 
       while(input.hasNext()) 
       { 
        s = input.nextLine().trim(); 
        eloc++; 
        if(s.equals("")) 
        { 
         bloc++; 
        } 
        if(s.startsWith("//")) 
        { 
         cloc++;  
        } 
        if(s.contains("/*") && !s.contains("*\\")) 
        { 
         cloc++; 
         while(!s.contains("*/")) 
         { 
          cloc++; 
          eloc++; 
          s = input.nextLine(); 
         } 
        } 
        else if(s.contains("/*") && s.contains("*\\")) 
        { 
         cloc++; 
        } 
       } 
       System.out.println("Total number of lines: "+eloc); 
       System.out.println("ELOC: "+(eloc-(cloc+bloc))); 
       System.out.println("Blank Lines: "+bloc); 
       System.out.println("Comment Lines: "+cloc); 
      } 

任何意見/建議將不勝感激..謝謝!

+0

http://stackoverflow.com/questions/2184999/sloc-for-java-projects –

+1

你說它「並不總是給出正確的答案。」當它是錯的時候,它怎麼錯了?你能給個例子嗎? –

+0

我將我的結果與locmetrics.com進行比較,未得到相同的結果。 – sap

回答

2

在Unix系統中,你可以簡單地使用cloc。這給你以下輸出:

src$ cloc . 
51 text files. 
51 unique files.        
285 files ignored. 

http://cloc.sourceforge.net v 1.53 T=0.5 s (82.0 files/s, 5854.0 lines/s) 
------------------------------------------------------------------------------- 
Language      files   blank  comment   code 
------------------------------------------------------------------------------- 
Java       39   618   119   2145 
XML        2    8    0    37 
------------------------------------------------------------------------------- 
SUM:       41   626   119   2182 
------------------------------------------------------------------------------- 

代碼行不包含評論或空白,但包括像使用cloc for Java的塊括號或導入語句。

還有其他可用的工具,但是這是最簡單的,如果你只是需要統計代碼行。希望這可以幫助。

0

例子不會產生預期的罪狀:

int a; 
a = 7; // comment, yeah 
int b /* my favorite variable */ = 3; 
executeMethod(dataField, 
    moreData,excitingBoolean,resultSetFromMyGrandma, 
    anotherParameterTakingAnotherWholeLine); 

你的程序沒有處理意見或者多行語句很優雅。

編輯

我建議完全解析它變成一棵樹,由Java編譯使用語法識別的意見和可執行的代碼行,並從那裏計數。有很多例外,簡單的檢查可能會跳過。此外,可考慮行:

String commentCodeFun = " // not a real comment ";

這對你目前的做法

+0

你怎麼建議我處理這樣一行:「a = 7; //評論,是啊」或「int b/*我最喜歡的變量*/= 3;」 – sap

+0

他們不應該增加eloc和cloc嗎? – Atreys

+0

是真的,但我會在我的if語句中加入什麼? – sap

1

空白行可能不會有一個長度爲零的噩夢。他們的內容可能包含空白,至少是我的內容。嘗試trimming它檢查長度之前,以獲得更準確的計數。

我唯一能說的是,如果你有包含代碼和評論的行,你的號碼將被關閉。它看起來像你現在會考慮一整行的註釋,如果它甚至部分包含註釋的代碼。例如:

Validate(input); // This validates user input 

這不會被視爲ELOC,而是CLOC。如果編碼風格更像這樣,這可能不成問題:

// Validate user input 
Validate(input); 

但並非每個開發人員都會使用第二種方法。我個人使用兩者的組合取決於上下文。

+0

好點。我添加如果(s.trim()。length()== 0)但不知道如何處理一行,如:驗證(輸入); //這驗證用戶輸入 – sap

+0

您可以增加ELOC和CLOC。 –