1

私はPHPのバックグラウンドから来ており、PHPでは連想配列(疑似コード)を使用して次の構造が可能です。

test["1"]["2"] = true;
test["2"]["4"] = true;

PHPでは次のことが簡単にできるので、Javaでも同じことをしたいと思います。

if(test[var1][var2] == true) {
    ...
}

私はこの構造が気に入っています。なぜなら、いくつかの制約 (つまり構成要素) を簡単に定義できるからです。重要なことは、階層が必要だということです。そのため、PHP で 2 次元配列を使用しています。

しかし、Javaで同じことを探していたとき、PHPほど簡単に達成できるものは見つかりませんでした。クラスの助けを借りて階層を作成する必要があると言う人もいれば、列挙型を扱うべきだと言う人もいます。いくつかの単純な定義ではプログラミングのオーバーヘッドが大きくなるため、私は両方の方法が好きではありません。

数行のコードで実現でき、上記の例のように同じことを行う Java の簡単なソリューションはありますか? ベストプラクティスは何ですか?

4

1 に答える 1

4

うーん、マップのマップを使用できます。

Map<String, Map<String, Boolean>> map = new HashMap<String, Map<String, Boolean>>();

ただし、初期化は簡単ではないため、このマップをクラスの背後に隠します。内部マップも作成する必要があります。

最終的に次のように使用できます

String var1 = "1", var2 = "2"
if (map.get(var1).get(var2))
{
   /* Without proper initialization map.get(var1) could be null,
    * so it's important that you create the innermap up on first use of 'var1':
    * map.put(var1, new HashMap<String, Boolean>());
    *
    * and to associate var1 and var2 with a boolean value:
    * map.get(var1).put(var2, true);
    */
}

またはさらに良い

MapHider instance = new MapHider();
if (instance.check(var1, var2))
{
}

一般的なアプローチと使用例

/**
 * AssociativeArray2D - Two dimensional associative array
 *
 * NOTE: Not thread-safe.
 *
 * @param <K1> type of first key
 * @param <K2> type of second key
 * @param <V> type of value
 */
public class AssociativeArray2D<K1, K2, V> {

    /* standard value if no value is in the map */
    private final V standard;
    private Map<K1, Map<K2, V>> map = new HashMap<K1, Map<K2, V>>();

    public AssociativeArray2D(V standard) {
        this.standard = standard;
}

    public static AssociativeArray2D<String, String, Boolean> getSSB() {
        return new AssociativeArray2D<String, String, Boolean>(false);
}

    public void add(K1 first, K2 second, V value) {
        Map<K2, V> m = map.get(first);
        if (m == null) {
            m = new HashMap<K2, V>();
            map.put(first, m);
        }
        m.put(second, value);
    }

    public V check(K1 first, K2 second) {
        Map<K2, V> m = map.get(first);
        if (m == null) {
            m = new HashMap<K2, V>();
            map.put(first, m);
            m.put(second, standard);
        }
        return m.get(second);
    }

    public static void main(String[] args) {
        AssociativeArray2D<String, String, Boolean> a = AssociativeArray2D.getSSB();

        if (a.check("1", "2")) {
            System.out.println("This, won't print!");
        }

        a.add("1", "2", true);

        if (a.check("1", "2")) {
            System.out.println("This, will print!");
        }
    }   
}

出力

これは、印刷されます!

于 2013-09-07T10:56:20.877 に答える