循环通过JAVA StringTokenizer

Lon*_*rli -5 java

拜托,我需要帮助.谢谢

我从硬盘上读到一个文本文件,其中包含如下....

void main()
{

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

}
Run Code Online (Sandbox Code Playgroud)

所以,我需要做的是......让我说我有一个......

String []KeyWord = {"void", "main()"};
String []DataType = {"int", "float"};
Run Code Online (Sandbox Code Playgroud)

所以我想遍历每个令牌并检查它是否是关键字或数据类型.我使用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");
        }
    } 
} 
Run Code Online (Sandbox Code Playgroud)

Rav*_*yal 5

不,你的代码不起作用.当你迭代令牌时,你永远不会增加k和l,它们会一直存在0; 暗示您始终只检查第一个关键字和数据类型.

建议

  • 当你有一个以上的分隔符和一些比基本分割更高级的需求时,通常使用更简单的String.split()代替StringTokenizer.而且,由于你传递returnDelimstrue(第三个参数)您收到您的空间追溯到您的令牌,以及(这ins't你想要什么我想).

  • 使用a HashSet<String>存储关键字/数据类型而不是Array或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);
            }
        }
     }
    
    Run Code Online (Sandbox Code Playgroud)