3

この質問を拡張して、複数の条件を処理するためのより良い構成であるため、この場合はルックアップテーブルまたはハッシュマップを使用するという回答を受け入れました。

現在の構成。

メッセージを保存するクラス。

    public class ProgressMessages 
    {
     public static String msg1="Welcome here .....";
     .
     .
     .
     //around 100 more similar static variables.
    }

上記のクラスからの適切なメッセージを調整して表示します。

    int x=calculatedVal1(m,n); 
    int y=calculatedVal2(o,q);

    SimpleDateFormat formater=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date d=new Date();
    String s=formater.format(d);

    try {
          long d1 = formater.parse("2013-01-10 13:53:01").getTime();
          long d2=formater.parse(s).getTime();
          totaldays=Math.abs((d1-d2)/(1000*60*60*24));
         } catch (ParseException e) {
            e.printStackTrace();
         }

    if(totaldays<7&&x<20)
     {
      System.out.println("my message...1"+ProgressMessages.msg1); 
     }

    else if(totaldays<7&&x>10&&y<20)
    {
      System.out.println("my message...2"+ProgressMessages.msg2);
    }   
    ....
    //obvioulsy 100 more else-if's to display 100 messages.

この場合、ルックアップテーブルがどのように役立つかを実際に知りたいですか?

java Hashmap / Hashtableなどでどのように実装する必要がありますか?どのように有利ですか?

- - 編集 - -

適用する方がクリーンなので、@assyliasanwerを使用します。しかし、列挙型を使用する場合は、修正があります。

全体像を説明するには...

つまり、メッセージのリストは次のようになります...

1)「ようこそ」+ nameOfUser+"成功率は"+succssRate + "%"+以前は+以前+"%"でした。

2)「ああそうです..」+ succssRate + "%"+は+以前の+"%"から改善されました。

3.)「今度は」+exerCiseNameに焦点を当てる必要があります。

文字列データが修正されているため、列挙型を使用してこれを行うにはどうすればよいですか?別のコンストラクターを作成できますか?assylasへの編集コードの例はどのように答えますか?

4

3 に答える 3

3

メッセージのリストがコンパイル時にわかっていると仮定すると、列挙型を使用できます。利点は、各メッセージがその条件を保持する責任を負うようになり、呼び出しコードがはるかに単純になることです。

public enum Message {

    MESSAGE1("Welcome") {
        @Override
        boolean isApplicable(long totalDays, int x, int y) {
            return totalDays < 7 && x < 20;
        }
    },
    MESSAGE2("Bye bye") {
        @Override
        boolean isApplicable(long totalDays, int x, int y) {
            return totalDays < 7 && x > 10 && y < 20;
        }
    };

    private String msg;

    Message(String msg) {
        this.msg = msg;
    }

    abstract boolean isApplicable(long totalDays, int x, int y);

    public static String lookupMessage(long totalDays, int x, int y) {
        for (Message m : Message.values()) {
            if (m.isApplicable(totalDays, x, y)) {
                return m.msg;
            }
        }
        throw new IllegalArgumentException();
    }
}

呼び出しコードでは、if / else if はもう必要ありません。コードは 1 行だけです。

System.out.println(Message.lookupMessage(1, 2, 3));

注 1: ルックアップは O(n) 操作であるため、Map を使用するほど効率的ではありませんが、n が 100 程度であるため、パフォーマンスが大幅に低下することはありません。また、他の回答で提案されているソリューションよりも読みやすく、保守が容易です。

注 2: 条件/メッセージをフラット ファイルに入れ、実行時にファイルを読み取り、スクリプト エンジンを使用して実行時に各条件を評価することもできます。少し遅くなりますが (ただし、ここではサブミリ秒について話しています)、コードからすべての混乱を取り除き、構成ファイルに入れます。

于 2013-01-10T07:52:25.213 に答える
2

私は

Map<Criteria, Message> lookupTable;

whereは、メッセージを選択する基準を表す、作成する (および と をオーバーライドする)クラスCriteriaです。equals()hashCode()

Messageは、実際のメッセージをカプセル化するStringだけでなく、変数を設定するための機能も提供する、作成するクラスでもあります。

このソリューションでは、プログラムの開始時に一度マップを初期化する必要があり、常に次のように使用できます。

Criteria criteria = ... // gather your criteria somehow
Message msg = lookupTable.getMessage(criteria);
// use your variable setting methods here
String message = msg.toString();
于 2013-01-10T13:17:09.233 に答える
0

非常に多くの条件がある場合、それらの条件をコードのどこかに配置することは避けられません。ルックアップ テーブルを使用する利点は、1) 実装が簡単です。2)柔軟。将来、メッセージの値を変更したい場合は、looktable クラスに移動して変更できます。

于 2013-01-10T07:37:58.683 に答える