通过JAVA字符串标记器循环

通过JAVA字符串标记器循环,java,Java,求你了,我急需帮助。多谢各位 我从我的硬盘上读到一个文本文件,其中包含以下内容 void main() { int A = 5; int B = 5; int C ; C = A + B; cout << C ; } 所以我想循环检查每个标记,并检查它是一个关键字还是一个数据类型。我使用java netBeans,代码如下 int k = 0; int l = 0; StringTokenizer Tokens; while ((

求你了,我急需帮助。多谢各位

我从我的硬盘上读到一个文本文件,其中包含以下内容

void main()
{

    int A = 5;
    int B = 5;
    int C ; 
    C = A + B;
    cout << C ; 

}
所以我想循环检查每个标记,并检查它是一个关键字还是一个数据类型。我使用java netBeans,代码如下

int k = 0; int l = 0;

StringTokenizer Tokens;

while ((CurrentLine = ReadFile.readLine()) != null)
{
    Tokens = new StringTokenizer(CurrentLine, " ", true);
    for (int i = 0; Tokens.hasMoreTokens(); i++)
    {
        if (Tokens.nextToken().contains(KeyWord[k]))
        {
            jTextArea1.append(KeyWord[k] + "\n");
            k++;
        } 
        else if (Tokens.nextToken().contains(DataType[l]))
        {
            jTextArea2.append(DataType[l] + "\n");
        }
    } 
} 

首先,将
关键字
数据类型
数组转换为
数组列表

然后,做一些类似的事情:

while ((currentLine = ReadFile.readLine()) != null) {
   String[] tokens= currentLine.split(" ");
   for (String token : tokens) {
      if (keyWord.contains(token)) {
         jTextArea.append(token);
      }
   } 
    //rest of the code is similar
}

不,你的代码不起作用。当你在代币上迭代时,你从不增加k和l,它们一直保持
0
;这意味着您总是只检查第一个关键字和数据类型

建议
  • 使用更简单的
    String.split()
    而不是
    StringTokenizer
    ,当您有多个分隔符并且需要比基本拆分更高级一点时,通常会使用
    StringTokenizer。由于您将
    returnDelims
    作为
    true
    (第三个参数)传递,因此您也将空格作为令牌接收回来(我想这不是您想要的)。

  • 使用
    HashSet
    来存储关键字/数据类型,而不是数组或ArrayList。与迭代数组或使用
    ArrayList.contains()
    相比,这将为您提供更好的性能。

  • 示例实现

    HashSet<String> keyWords = new HashSet<String>(
            Arrays.asList(new String[] {"void", "main()"}));
    HashSet<String> dataTypes = new HashSet<String>(
            Arrays.asList(new String[] {"int", "float"}));
    
    String newLine = System.getProperty("line.separator");
    while ((currentLine = readFile.readLine()) != null) {
        String[] tokens= currentLine.split(" ");
        for (String token : tokens) {
            if (keyWords.contains(token)) {
                jTextArea1.append(token + newLine);
            } else if (dataTypes.contains(token)) {
                jTextArea2.append(token + newLine);
            }
        }
     }
    
    HashSet关键字=新HashSet(
    asList(新字符串[]{“void”,“main()”});
    HashSet数据类型=新HashSet(
    asList(新字符串[]{“int”,“float”});
    字符串newLine=System.getProperty(“line.separator”);
    而((currentLine=readFile.readLine())!=null){
    String[]tokens=currentLine.split(“”);
    for(字符串标记:标记){
    if(关键字.contains(令牌)){
    jTextArea1.追加(令牌+换行符);
    }else if(数据类型.包含(令牌)){
    jTextArea2.追加(令牌+换行符);
    }
    }
    }
    
公共静态void main(字符串gkadc[]){
String s=“天空是”;
StringBuilder sb=新的StringBuilder();
StringTokenizer t=新的StringTokenizer;

对于(int i=0;iGodness gracious learn Java命名约定,此代码不可读。请小心,您对索引变量(k和l)的使用非常奇怪,而且在
if
/
else if
条件中无意中消耗了太多的令牌。为什么不尝试
设置关键字
而不是
字符串[]关键字
?然后您会得到
if(keywords.contains(token))
,更简洁了…只是一些提示。那么你的问题是什么?有错误吗?它不符合你的预期吗?谢谢兄弟的回答…你没有努力检查语法分析器、词法分析器等的理论。你到底有什么问题?你是最有帮助的darijan。我如何用JAVA声明arraylist。对不起,兄弟,因为我是Java新手非常感谢Ravi,如果你有时间,请给我写完整的代码,以便我能很好地理解。感谢兄弟我如何使用哈希集。感谢Ravi如果我想检查文件的每一行是否以分号结尾,该怎么办?检查
if(currentLine.endsWith(“;”){//是的,它以分号结尾}在您的代码中,。我很乐意帮助您。请考虑接受答案。您可以用ReEX拆分字符串,但这是另一种方式,在这里,我们将通过迭代它来追加来自令牌字符串的每个元素。
HashSet<String> keyWords = new HashSet<String>(
        Arrays.asList(new String[] {"void", "main()"}));
HashSet<String> dataTypes = new HashSet<String>(
        Arrays.asList(new String[] {"int", "float"}));

String newLine = System.getProperty("line.separator");
while ((currentLine = readFile.readLine()) != null) {
    String[] tokens= currentLine.split(" ");
    for (String token : tokens) {
        if (keyWords.contains(token)) {
            jTextArea1.append(token + newLine);
        } else if (dataTypes.contains(token)) {
            jTextArea2.append(token + newLine);
        }
    }
 }
public static void main(String gkadc[]) {
 
    String s = "the                   sky                     is         ";
    StringBuilder sb = new StringBuilder();
     
    StringTokenizer t = new StringTokenizer(s);
      
    for(int i=0;i<( 2*t.countTokens() +1  );i++) {//imp line
        sb.append(t.nextElement()+" ");
    }     
    System.out.println( sb); 
 
} 

//out _   "the sky is"