-5

私はひどく助けが必要です。ありがとうございました

次の内容を含むテキストファイルをハードディスクから読み取りました....

void main()
{

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

}

だから、私がする必要があるのは..の配列があるとしましょう...

String []KeyWord = {"void", "main()"};
String []DataType = {"int", "float"};

したがって、各トークンをループして、たとえばキーワードかデータ型かを確認したいと思います。私は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");
        }
    } 
} 
4

3 に答える 3

6

いいえ、あなたのコードは機能しません。トークンを繰り返し処理している間、最後まで残っ0ている k と l をインクリメントすることはありません。常に最初のキーワードとデータ型のみをチェックしていることを意味します。

推奨事項

  • 複数の区切り文字があり、基本的な分割よりも少し高度なニーズがある場合に一般的に使用されるString.split()代わりに、より単純なものを使用してください。StringTokenizerそして、 (3 番目のパラメーター)returnDelimsとして渡しているためtrue、スペースもトークンとして返されます (これは、私が望むものではありません)。

  • 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);
            }
        }
     }
    
于 2013-05-15T13:19:21.747 に答える