2011-08-10 45 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。 –