有没有比保留相同功能的三个嵌套地图更好的解决方案?

时间:2012-01-30 12:53:48

标签: java data-structures collections

情况如下

private Map<String, Map<String, Map<String, String>>> properties;

我希望能够访问所有级别 - 从内部地图获取Map<String, Map<String, String>>Map<String, String>或只是String

这可以更好地避免这种嵌套结构吗?创建一个隐藏实现并提供简单方法的包装器是显而易见的解决方案,但它只是隐藏了主要问题。

3 个答案:

答案 0 :(得分:6)

我喜欢Key方法。

public class Key {

   private String keyA;
   private String keyB;
   private String keyC;

   public Key(String a, String b, String c) {
      keyA = "".equals(a) ? null : a;
      keyB = "".equals(b) ? null : b;
      keyC = "".equals(c) ? null : c;
   }

   public String getKey(){
      return keyA + keyB + keyC;
   }

   // equals() can be implemented using getKey()
}

然后:

Map<Key, String> map = new HashMap<Key, String>();
map.put(new Key("a", "",""), "only one key");
map.put(new Key("a", "b", "c"), "all keys");

请注意,您只需要一张地图,并且仍然可以获得仅包含keyA的对象,因为它将具有不同的键值。

当然,如果您想要存储具有相同索引的多个对象(或者在搜索{{1时)恢复以相同键开头的多个对象,例如在recover Key("a", "a", "a")Key("a", "a", "b)中它不会起作用。但是,你不应该使用Key("a", "a", ""),并且应该得到一个合适的数据库。

答案 1 :(得分:0)

您可以考虑查看Google Guavas Collection课程 - 也许您可以找到一个合适的实施方案,您可以使用“开箱即用”而不是自己动手?

答案 2 :(得分:0)

一个干净的解决方案(虽然最初更麻烦)是normalize您的数据,并将它们加载到内存中database。然后,使用JPA,您可以利用所有OneToMany关系并获取共享一个或多个键的对象集合。