3

アプリにテキスト ボックスがあり、ユーザーは何でも入力できます。キーワードに基づいていくつかのコマンドを解釈するコントローラーを作成しています。

ユーザーは、パスワードを設定するかどうかを選択できます。それに応じて、私のインタープリターはパスワードを期待するかどうかを判断します。

たとえば、パスワードが設定されていて、ユーザーが「password1 show list」と入力した場合。インタプリタは最初の単語でパスワードをチェックし、次にコマンド (show)、次に引数 (list) をチェックします。

パスワードが設定されていない場合、ユーザーが「show list」と入力すると、インタープリターが理解します。

私の現在のコードは次のとおりです。

// 'words' is a String array which contains the user input.

if (passwordEnabled()==true) {

    if (words[0].contentEquals(getPassword())
                    && words[1].contentEquals("show")
                    && words[2].contentEquals("list")) {

        // Perform action

    }
}
else {

    if (words[0].contentEquals("show")
                    && words[1].contentEquals("list")) {

        // Perform action

    }

}

私の質問は、コマンドを処理するためのより効率的/より良い方法はありますか? 私はそれを行うための非常に粗雑な方法だと確信しています。

4

3 に答える 3

2

ユーザーがコマンドの構文を覚えていれば、あなたのやり方 (または文法ベースのアプローチ) は問題ありません。

ユーザーが制限のない自然言語で意図を表現するときにユーザーを理解したい場合は、自然言語理解を行う必要があります。

Wit ( http://wit.ai ) のようなものがあなたのために仕事をしてくれるかもしれません。機械学習に基づいています。ユーザーの意図と正規化されたパラメーターを使用して、自由なテキスト文を JSON に変換します。

于 2013-09-07T20:10:33.317 に答える
1

文法または有限オートマを構築することは、それを行うための正しい方法であることに同意しました.

簡単な方法が必要な場合は、次のようにコードを単純化できます。

if (passwordEnabled()) {
    if  (! words.get(0).contentEquals(getPassword()))
    {
        // wrong password
        return;
    }
    words.remove(0); // skip password
}

if (words.get(0).contentEquals("show")
                && words.get(1).contentEquals("list")) {

    // Perform action

}

ArrayListforを使用するとしますwords

于 2013-09-07T10:29:13.097 に答える