3

ユーザー入力を解析する方法を探しています。入力は、実行する必要がある検索と、それらをどのように組み合わせる必要があるかを示す必要があります。

  • 1と2
  • (3 と 2) または 1
  • (3 と 2) または (1 と 4)
  • ( (3 または 4) および 1) または 2

最初の例では、検索 1 と 2 の結果を AND 方式で結合する必要があります。2 番目の例では、検索 3 と 2 の結果を AND 方式で結合し、この結合の結果を検索 1 の結果に OR 方式で結合する必要があります。等。

これを行う方法についてのアイデアはありますか?

4

5 に答える 5

2

'結果'は、次のインターフェイスでandなどのメソッドを提供するオブジェクトと考えてください。

public interface AndOrCapable<T> {
  public T and(T anOtherResult);
  public T or(T anOtherResult);
}

次に、ユーザー入力を次のように変換できます。

Result total = r2.or(r1.and(r3.or(r4))); // your fourth example

これは、概念を明確にするためだけのものです。ユーザー入力を使用するため、動的評価者が必要です。

したがって、ユーザー入力を(構文)ツリーに変換するためのバリデーター/パーサーが必要です。これは、合計を計算するために使用するモデルになります。

それが少し役に立ったことを願っています!

于 2009-11-24T12:58:06.987 に答える
2

JavaCC は、このためのパーサーを生成するために使用する優れたツールです。あるいは、構文を少し変更できる場合は、スキーム インタープリターを使用して Java でスクリプト機能を使用できる可能性があります。

( (3 OR 4) AND 1) OR 2

になる

(OR (AND (OR 3 4) 1) 2)

次に、AND/OR を実装するだけです。

于 2009-11-24T14:39:33.147 に答える
1

一般的なキーワード検索用のパーサーを作成する方法に関するいくつかのインスピレーション...

質問にjavaのタグを付けましたが、Pythonでのsearchparserの例を次に示します。これは、文法を取得してコードを作成するパーサージェネレーターであるpyparsingを使用します。このコードは、パーサーユーザー入力に対して実行できます。

https://github.com/pyparsing/pyparsing/blob/master/examples/searchparser.py

テストスイートを含む293行のコード。多分それは出発点としてあなたを助けます...

于 2009-11-24T12:56:26.490 に答える
1

クリーンな解決策は、中置パーサーを作成することです。オンラインにはかなりの数のコード例があります。ただし、この例では、演算子の優先順位などは必要ないため、より単純なアルゴリズムで十分な場合があります。

コーディングの注意として:このStreamTokenizerクラスは、入力文字列の解析に役立つ場合があります。

于 2009-11-24T13:01:11.503 に答える
1

実装の最後に (パーサーができたら、検索を整理して実行します):

  1. オブジェクトが単純な条件である場合、またはブール値で 2 つの単純な条件を結合する複合条件である場合 (子を持つ IE 親ノードと)、Conditionツリーを作成する場合はどうでしょうか。ConditionANDConditionRangeConditionEqualsCondition

    次に、各アイテムに対してツリーのトップを評価します。この解は O(mn) で、m は条件の数、n は検索するアイテムの数ですが、冗長な条件を削除することでこれを最適化できます。最初の条件でほとんどのアイテムを排除すると、はるかに高速になります。

  2. バージョン 2: 各項目 (配列インデックスなど) に一意のキーを割り当て、各条件の検索を実行し、各条件を構築しHashSet<Key>ます。次に、必要なキーの最小セットから始めて、最終結果が得られるまで各条件のキーを削除または追加します。場合によっては、これは上記よりも高速になる場合があります。

注: これらのアプローチは、SQL データベースがどのように動作するかを模倣しています。システムが十分に大きいか複雑な場合は、同じことを行う独自のコードを記述する代わりに、データベースを使用して調査する必要があります。

于 2009-11-24T13:25:24.933 に答える