1

わかりました、これを説明するのは少し難しいかもしれません。ある種のハッシュマップを作成する方法を探しています。これには、既に知っているキーが入力されます (作成しているオブジェクトのプロパティであるため)。これらの既知の各キーには、文字列、int、または float (自動ボックス化される)、または後で何らかのオブジェクト/関数 (その部分をどのように行うかはまだわかりません) のいずれかの値があります。とにかく、それはさらに先のことになります)。また、各キーを受け入れるタイプを設定したいと思います(キー「x」は整数型の値のみを受け入れ、キー「式」は文字列のみを受け入れるなど)。

より多くのコンテキストを提供するために、私の目標は Tweener ユーティリティを構築することです。Java には、SumoTween を除いて、私のニーズにまったく合わないライブラリが見つからなかったからです。私は、Caurina のように自分のクラスを構築しようとしています。時間と手間を省けるより良い代替案があれば、お気軽に共有してください (Tweeners についてでも、ハッシュマップの質問についてでも)。ちなみに、ビットマップ/描画可能オブジェクトでアニメーションを行うために、作成中のAndroidゲームでこのTweenerを使用しています(これらのアニメーションクラスは使用できません)。

PS : これはこの Web サイトでの最初の質問です。あまり混乱しないようにお願いします。我慢してください。

4

6 に答える 6

4

なぜこれにハッシュマップを使用しているのですか? 「キー」を知っている場合は、それらのメンバーでクラスを作成するだけで、好きなように入力できます。

何らかの理由で本当にハッシュマップを使用する必要がある場合は、ハッシュマップを拡張して put() メソッドをオーバーライドして、マジック値をチェックすることができます。しかし、私はそれに対して強くお勧めします。それは貧弱なデザインです.

于 2011-07-10T23:44:37.730 に答える
0

map を直接使用することは避けたいと思います。あなたが探しているのは、おそらくよりアプリケーション固有のものです。

あなたが構築しているもの全体が一連の設定用であると仮定します。「設定」には、事前定義されたキーのセットがあります。各キーは、特定の値の対応する設定値を受け入れるように事前定義されています。間違った型が指定された場合、例外がスローされます。

おおよそ次のようなものが合理的だと思います。

enum SettingValueType {
  public boolean isCorrectType(Object obj) {
    return true if obj is correct type represented by this enum 
  }
  STRING, INT, FLOAT   // add support to other type if u want
};

clsss SettingValue {
  SettingValueType type;
  Object value;
}

class SettingRepo {  // a repository of setting entries
  private Map<String, SettingValueType> allowedKeyAndType;
  private Map<String, Object> settings;

  SettingRepo() {
    // setup allowedKeyAndType programmatically or from config etc, depends on your design
  }

  public SettingValue setSetting(String key, Object value)  {

    SettingValueType valueType = allowedKeyAndType.get(key);
    if (valueType == null) {
      throw new KeyNotAllowedException();
    }

    if (v!alueType.isCorrectType(value) {
      throw new ValueIncorectTypeException();
    }

    return settings.put(key, new SettingValue(valueType, value));
    }
  } 

  public SettingValue getSetting(String key) {
    // u may throw exception if key is not in predefined set

    return settings.get(key);
  }

  // u may consider adding some convinient methods too:
  public String setStringSetting(String key, String value) {
    if alllowedKeyAndType do not contains key {
      throw KeyNOtAllowedException
    }
    if type is not STRING {
      throw IncorrectTypeExceptin
    }
    settings.put(key, new SettingValue(STRING, value))
  }

  public String getStringSetting(String key) {
    // should be straight forward now, right?
  }    
}

使い方に応じて改善できる場所はたくさんあります。タイプが非常に動的である場合は、SettingValueType を一連の戦略のようにするか、Class を直接使用することができます。setSetting() はジェネリックにすることができ、クラスを追加のパラメーターなどとして取ることができます。しかし、少なくとも、これは ua の出発点を与えるはずです。

于 2011-07-11T01:06:28.757 に答える
0

私の理解が正しければ、あなたは基本的に HashMap を探しています。あれは正しいですか?

PS はい、そのように「オブジェクト」を使用するのはあまりきれいではありません。

于 2011-07-10T23:44:22.597 に答える
0

これがあなたが求めているものかどうかは完全にはわかりませんが、キーにある種のインターフェース/抽象クラスを使用し、キーの種類ごとに適切に実装/拡張できるように思えます。

public interface Key {}

private static final class StringKey implements Key {
    private final String value;

    public StringKey(String value) {
        this.value = value;
    }

    // hashCode, equals here
}

// IntegerKey, FloatKey, etc similarly

次に、次のようなものがあります。

HashMap<Key, Integer> map = new HashMap<Key, Integer>();
于 2011-07-10T23:44:38.180 に答える
0

たとえば、HashMap から継承するカスタム クラスを作成すると思います。挿入時に、指定されたキー/値が有効かどうかを確認します。

public static final HashMap<String, Class<?>> allowedTypes = new HashMap<String, Class<?>>() {{
    put("key1", String.class);
    put("key2", Integer.class);
    // etc
}};

public class CustomHashMap extends HashMap {
    public Object put(Object key, Object value) {
        Class<?> type = allowedTypes(key);

        if(type != null && !type.isInstance(value))
            throw new IllegalArgumentException("Invalid type for key " + key);

        return put(key, value);
    }

    private void PutAll(Map m) {
        for(Entry<?, ?> entry : m.entrySet())
            put(entry.getKey(), entry.getValue());
    }
}
于 2011-07-10T23:45:02.847 に答える
0

文字列用に 1 つずつ、個別のマップを作成できます。また、これらのマップのいずれかに追加する場合、キーを (グローバル) セットに追加して、マップ間でキーが重複しないようにすることができます。それはあなたのニーズをうまく満たしていないと思います (そしてもちろん、ルックアップはもう少し複雑です) が、それがうまくいくなら素晴らしいことです。

おそらく、より良いオプションは、別のレベルの間接化を追加することです。YourThing が保持する各タイプのサブクラスを持つ Hashmap にマップを作成します。したがって、StringYourThing には String データ メンバーがあります。IntegerYourThing には int データ メンバーなどがあります。YourThing が、現在、これらすべての異なるデータ型を一貫して処理しようとしている別のクラス内のどこかで switch ステートメントである機能を引き受け始めていることに驚かないでしょう。そのクラスが YourThing と単純に対話できる場合は、より単純になる可能性があります。しかし、コードを見ずに知ることは困難です。

于 2011-07-10T23:55:45.077 に答える