Java - 查找可执行代码行的算法

时间:2011-08-10 18:27:10

标签: java algorithm

我编写了一个java程序,它只扫描并查找可执行代码行(ELOC),空行代码(BLOC)和注释(CLOC),仅用于java和c ++代码。以下是我的代码:

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

任何评论/建议都将不胜感激。谢谢!

3 个答案:

答案 0 :(得分: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的块括号或import语句。

还有其他可用的工具,但如果您只需要计算代码行,这是最简单的。希望这会有所帮助。

答案 1 :(得分:1)

空行的长度可能不为零。他们的内容可能包含空格,至少是我的。在检查长度之前尝试trimming,以获得更准确的计数。

我唯一能说的是,如果您的行包含代码和注释,那么您的数字将会被关闭。如果它甚至部分包含注释,那么您现在的代码看起来会将整行视为注释。例如:

Validate(input); // This validates user input

这不会被视为ELOC而是CLOC。如果编码风格更像是这样,这可能不是问题:

// Validate user input
Validate(input);

但并非每个开发人员都会使用第二种方式。我个人根据具体情况混合使用。

答案 2 :(得分: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 ";

这对你当前的方法来说是一场噩梦