1

これが私の問題です。私は私が持つことができるオプションである3つのブール値を持っています。私は3つのオプションで複数の組み合わせを持つことができます:

つまり、オプションなし(すべてfalse)オプション1のみオプション1とオプション2オプション1とオプション2とオプション3オプション2のみオプション2とオプション3オプション3のみなど

すべての組み合わせをチェックする必要がありますが、ifelseifステートメントを大量に記述したくありません。

結果がどうあるべきかを知る方法はありますか?

何かのようなもの

result = option1 & option2 & option3

次に、switchステートメントを使用して正しい組み合わせを処理できます

より詳細な説明が必要な場合はお知らせください。前もって感謝します。

ps私がここでやろうとしているのは、ifステートメントがあまりにも多くないようにして、コードをよりクリーンでより適切に設計できるようにすることです。ですから、別の方法を考えていただければ幸いです。

ありがとう

4

3 に答える 3

2

考えられる結果ごとにKarnaugh_mapを生成できます。そのルールを使用して、特定の条件セットのロジックを単純化して、可能な限り最小限に抑えることができます。

ただし、明確にするために行くのが最善だと思います。特定の分岐が行われる理由については、ロジックフローをたどってみてください。複雑すぎる場合は、状況を再考する必要があります。

于 2011-06-21T18:44:49.083 に答える
1

スイッチで8つのケースすべてを把握する1つの方法は、次のとおりです。

ブール値を異なるintフラグ(1ビットのみが設定された値)に変換し、これらをビット単位のORと組み合わせてから、8つの可能な値をオンにします。

int combination = (option1 ? 1 : 0) | (option2 ? 2 : 0) | (option3 ? : 4 : 0);

switch(combination) {
case 0: // !1 && !2 && !3
  ...
break;
case 1: // 1 && !2 && !3
  ...
break;
case 2: // !1 && 2 && !3
  ...
break;
case 3: // 1 && 2 && !3
  ...
break;
case 4: // !1 && !2 && 3
  ...
break;
case 5: // 1 && !2 && 3
  ...
break;
case 6: // !1 && 2 && 3
  ...
break;
case 7: // 1 && 2 && 3
  ...
break;
}

このアプローチでは、8つのケースすべてを同等に処理できます。ただし、組み合わせの数が指数関数的に増加するため、ブール値を追加すると手に負えなくなります。

于 2011-06-21T21:14:57.560 に答える
0

私のソリューションはブール値では機能しませんが、適応させることができます。たとえば、Option.CombinedOption.get(Option.ONE、Option.THREE)を呼び出すと、列挙型のCombinedOption.OPTION_1_3が返されます。

public enum Option {
ONE, TWO, THREE;

public enum CombinedOption {

    ALL_FASLSE(), OPTION_1(ONE), OPTION_1_2(ONE, TWO), OPTION_1_3(ONE,
            THREE), OPTION_1_2_3(ONE, TWO, THREE), OPTION_2(TWO), OPTION_2_3(
            TWO, THREE), OPTION_3(THREE);

    private Set<Option> keySet;

    private CombinedOption(Option... options) {
        if (options != null && options.length > 0)
            keySet = EnumSet.copyOf(Arrays.asList(options));
        else
            keySet = EnumSet.noneOf(Option.class);

    }

    private static final Map<Set<Option>, CombinedOption> optionMapping = new HashMap<Set<Option>, CombinedOption>();

    static {
        for (CombinedOption combined : CombinedOption.values()) {
            optionMapping.put(combined.keySet, combined);
        }
    }

    public static CombinedOption get(Option... options) {
        Set<Option> keySet;

        if (options != null && options.length > 0)
            keySet = EnumSet.copyOf(Arrays.asList(options));
        else
            keySet = EnumSet.noneOf(Option.class);

        return optionMapping.get(keySet);
    }
}

}

于 2011-06-21T20:55:09.583 に答える