我编写了一个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);
}
任何评论/建议都将不胜感激。谢谢!
答案 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 ";
这对你当前的方法来说是一场噩梦