2

私はそれを回避する方法がわかりません。

詳細についてはヘルプが必要です

4

3 に答える 3

2

最初にMap<String, Shape>、可能なすべてのコマンドをキーとして、対応する形状を値として含むを作成します。

Map<String, Shape> shapesByCommand = new HashMap<String, Shape>();
shapesByCommand.put("circle", new Circle());
shapesByCommand.put("sun", new Sun());
...

次に、コマンドを受け取ると、対応する形状を取得して表示します。

Shape shape = shapesByCommand.get(commands[0]);
if (shape != null && "visible".equals(commands[1])) {
    makeVisible(shape);
}
于 2012-12-12T22:24:57.213 に答える
1

特に問題の最初の部分では、JB Nizet の回答がおそらく役立つと思います。ただし、質問の2番目の部分の一般的な解決策、つまり、で検索したい文字列に基づいて関数を呼び出す方法を求めてHashMapいる場合、おそらくやりたいことは、関数オブジェクトをそのHashMapに格納することです。次に、ルックアップ後にその関数オブジェクトを呼び出します (このディスカッションも役立つ場合があります)。

例を次に示します (シェイプではなく文字列を使用):

public interface Action {
    abstract void run(String s);
}

public static void main(String[] args) {
    HashMap<String, Action> actions = new HashMap<String, Action>();
    actions.put("visible", new Action() {
        public void run(String s) {
            System.out.println("Running 'visible' on: " + s);
        }
    });
    String input[];
    input = new String[2];
    input[0] = "sun";
    input[1] = "visible";
    actions.get(input[1]).run(input[0]);
}

出力: Running 'visible' on: sun

于 2012-12-12T22:43:48.867 に答える
0

HashMapここではa を使用しません。EnumMap

次に、 のコードで、すべての実装をさまざまなサブクラスenumのメソッドとして配置できます。enum

public enum Actions {
  visible, move, resize;

  public doAction(Shape s) {
    switch(this) {
      case visible:
        // handle command
        break;
      case move:
        // etc.
  }
}

public enum ShapeEnum {
  circle, sun, square;
}

次に、コードで次のことができます。

 try {
   Actions a = Actions.valueOf(command);
   Shapes s = Shapes.valueOf(shape);

   a.doCommand(myEnumMap.get(s));
 } catch (IllegalArgumentException e) {
   // not a command, handle it
 }
于 2012-12-12T22:23:29.897 に答える