我想从java中的文本文件中计算变量的总数,为此我们使用此代码
try {
BufferedReader reader = new BufferedReader(new FileReader(fn));
String line = reader.readLine();
while(line !=null)
{
Scanner fs = new Scanner(reader);
while(fs.hasNext())
{
String s = fs.next();
if( s.startsWith("int")) {
s1 = ";" ;
while(!(s1.equals(s2))){
Scanner fd = new Scanner(reader);
while(fd.hasNext()){
c = fd.next();
if(c.contains(","))
cint++;
else
cint++;
if(c.startsWith(";"))
break;
}
s2 = c ;
}
}
if(s.startsWith("short")) {
cshort++;
}
if(s.startsWith("byte")) {
cbyte++;
}
if(s.startsWith("long")) {
clong++;
}
if(s.startsWith("float")) {
cfloat++;
}
if(s.startsWith("boolean")) {
cboolean++;
}
if(s.startsWith("double")) {
cdouble++;
}
if(s.startsWith("char")) {
cchar++;
}
if(s.startsWith("abstract")) {
cabstract++;
}
if(s.startsWith("continue")) {
ccontinue++;
}
if(s.startsWith("switch")) {
cswitch++;
}
if(s.startsWith("assert")) {
cassert++;
}
if(s.startsWith("default")) {
cdefault++;
}
if(s.startsWith("goto")) {
cgoto++;
}
if(s.startsWith("package")) {
cpackage++;
}
if(s.startsWith("synchronized")) {
csync++;
}
if(s.startsWith("do")) {
cdo++;
}
if(s.startsWith("if")) {
cif++;
}
if(s.startsWith("private")) {
cprivate++;
}
if(s.startsWith("this")) {
cthis++;
}
if(s.startsWith("break")) {
cbreak++;
}
if(s.startsWith("implements")) {
cimplements++;
}
if(s.startsWith("protected")) {
cprotected++;
}
if(s.startsWith("catch")) {
ccatch++;
}
if(s.startsWith("extends")) {
cextends++;
}
if(s.startsWith("try")) {
ctry++;
}
if(s.startsWith("final")) {
cfinal++;
}
if(s.startsWith("interface")) {
cinterface++;
}
if(s.startsWith("static")) {
cstatic++;
}
if(s.startsWith("void")) {
cvoid++;
}
if(s.startsWith("instanceof")) {
cinstanceof++;
}
if(s.startsWith("class")) {
cclass++;
}
if(s.startsWith("finally")) {
cfinally++;
}
if(s.startsWith("strictfp")) {
cstrictfp++;
}
if(s.startsWith("volatile")) {
cvolatile++;
}
if(s.startsWith("const")) {
cconst++;
}
if(s.startsWith("native")) {
cnative++;
}
if(s.startsWith("super")) {
csuper++;
}
if(s.startsWith("while")) {
cwhile++;
}
if(s.startsWith("for")) {
cfor++;
}
}
line = reader.readLine();
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
insert();
问题在于它给出错误的整数变量数 请帮助我这个
答案 0 :(得分:0)
尝试添加其他内容,而不是百万ifs。如果一个变量以一个东西开头,它就不会从另一个开始。例如:
if(s.startsWith("short")) {
cshort++;
}
else if(s.startsWith("byte")) {
cbyte++;
}
这也将减少程序的编译时间。如果您可以访问该文件,则可以在单独的行中创建每个变量,以便于调试和读入。
答案 1 :(得分:0)
让我们看看试图计算int
变量的代码:
if( s.startsWith("int")) {
s1 = ";" ;
while(!(s1.equals(s2))){
Scanner fd = new Scanner(reader);
while(fd.hasNext()){
c = fd.next();
if(c.contains(","))
cint++;
else
cint++;
if(c.startsWith(";"))
break;
}
s2 = c ;
}
}
为什么这会给出错误的计数?
您将以"int"
开头的每个字词都视为int
个关键字。但事实并非如此。那么internal
或international
...
评论中的int
怎么样?评论应该被忽略。
int[] myarray;
怎么样?这不是int
变量。它是int[]
变量。
return (int) someVariable;
怎么样?这是一个类型转换,而不是声明。
public int someMethod() { ... }
怎么样?返回类型不是变量。
public void method(int a, char b) { ... }
怎么样?这是宣布int
变量...但您的代码(我认为)会错误地将其计为两个int
变量。
等等。
您的方法最好描述为粗略的一次通过模式匹配,直接作为代码实现。基本上,这种“分析”源代码的方法注定要失败。
您真正需要做的是使用识别Java语法的解析器正确解析 Java源代码。你可以:
编写自己的Java解析器,或
使用现有的Java解析器,或
寻找适合输入ANTLR或JavaCC或其他Java解析器生成器系统(PGS)的现有Java语法。
完成后,您可以遍历解析器发出的AST数据结构,也可以将“变量计数”代码嵌入到PGS输入文件的语法中。
还有另一种方法(来自链接的Q& A)。编译源文件,使用Class.forName()
加载它,然后使用反射来查找静态和实例变量的Field
个对象。在紧要关头,您甚至可以通过Method
对象计算方法签名中的参数。但局部变量不会被反射暴露出来......