0

この問題に遭遇するのはこれが初めてではなく、最後ではないでしょう。ユーザーが選択できるオプションが複数あり、このユーザーがいくつかの変数に入力を与えるが他の変数には入力しない場合は、無数の IF ステートメントを実行するよりも効率的な方法があるはずです。選択されていない状態では、いくつかの作業が必要です。

サブオプションを含む 5 つのオプションは、IF ステートメントの数が劇的に増加することを意味します。比較ロジックがまだ必要であるため、SWITCH が適用可能かどうかはわかりません。そのため、SWITCH を使用する前に何らかの方法で変数を評価する必要があります。これは再び IF になりますか?

範囲をすでに理解している場合は、これらのケースをより効率的に処理するためのパターンやソリューションについての洞察を教えてください。または、そうでない場合は、よりよく説明するために例を用意しました。これは非常に一般的な質問なので、理解できないと感じた場合は無視しないでください。説明が下手なだけかもしれません。

私の最初の例は非常に長いものでしたが、ユーザーの詳細の更新 (事前に入力されたフォーム + 検証) に関連していました。ユーザーがすべてではなく一部のパラメーターを送信し、変更されていないフィールドの検証をトリガーしたくない場合。つまり、これにより、多数のネストされた IF が生成されます。

次に、私の質問に関するすべての混乱を解消することを願っている2番目の例です。単純な HTML テーブルを考えてみましょう。このテーブルには、名前を持つ 4 つの列があります。

イベント名 | イベントタイプ | 偶数開始日 | イベント終了日

私のシナリオでは、2 つのフィールドによる並べ替えを許可する必要があります。

ユーザーとして、任意の 2 つのフィールドだけで 4X3= 12ケースの並べ替えを生成できます

3 つの場合、4x3x2= 24になります。

明らかに、IF または SWITCH ステートメントは私たちを救いません (簡単に言えば)。実際、私はめったに SWITCH ステートメントを使用しませんでしたが、少なくともJavaでは整数または文字列で切り替えることができるようにかなり制限されています。

しかし、SWITCH の面白い副次的な問題は、変数を渡す前にまずそれらを評価しなければならないことです。したがって、HTMLフォームから2つの変数を送信します sortByParamOne=NAME sortByParamTwo=TYPE

次に、次のことを宣言する必要があります。

if(sortByParamOne.equals("NAME")&&sortByParamTwo.equals("TYPE"))

case = 1

else if ...

case = 2

else if ...

変数を準備するためだけに合計 12x IF

いずれにせよスイッチは単一の入力でのみ機能し、異なる役割を担う 2 つのアクター変数がある場合はほとんど役に立たないようです。間違っている場合は修正してください。

この種の状況に対処するには、膨大な数の IF を使用せずにコードを簡潔に保つにはどうすればよいでしょうか? これは、設計パターンやプログラミング戦術ではなく、一種の数学的領域のように思われます。おそらく、考えられるあらゆる方法で任意の数のパラメーターを使用して ORDER BY できる SQL のように、集合論に関連している可能性さえあります。

私は、1 つの「春」の frmwrk 本で、テーブルに関するこのマルチソートの例の問題に章全体を捧げたと思います。おそらく、物事がどのように機能するかをほとんど述べていない別のライブラリ。手元にないので調べられません。

4

2 に答える 2

0

並べ替えの例を見てみましょう。ユーザーが並べ替えたい順序には多くの可能性がありますが、それらはすべて対称的です。つまり、同じ方法を適用するため、どのフィールドでソートするかは問題ではありません。

したがって、並べ替えを実行するためにカスタム コンパレータを作成する必要があるとしましょう。私は次のようなことをします:

public CustomComparator implements Comparator<TableRow> {
    // this will contain the column names that the table will be sorted by, in order
    // eg. "NAME", "TYPE", "STARTDATE"
    private List<String> conditions;

    public CustomComparator(List<String> cond) { conditions = cond; }

    public int compare(TableRow row1, TableRow row2)
    {
        for (String condition : conditions)
        {
            int result = row1.getColumn(condition).compareTo(row2.getColumn(condition));
            if (result != 0) return result;
        }
        return 0;
    }
}

もちろん、上記の例では、すべての列がComparable.

于 2013-09-22T05:33:43.853 に答える