1

我来自 PHP 背景,在 PHP 中,借助关联数组(伪代码)可以实现以下结构:

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

现在,我想在 Java 中做同样的事情,因为在 PHP 中我可以轻松地执行以下操作:

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

我喜欢这种结构,因为您可以轻松定义一些约束(即配置内容)。重要的是我需要层次结构,这就是我在 PHP 中使用二维数组的原因。

但是当我在 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 回答