Есть ли лучшее решение, чем три вложенных Карты, которые сохраняют одинаковую функциональность? - PullRequest
2 голосов
/ 30 января 2012

Вот ситуация

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

И я хочу иметь доступ ко всем уровням - получить Map<String, Map<String, String>>, Map<String, String> или просто String с внутренней карты.

Можно ли сделать это лучше, чтобы избежать этой вложенной структуры? Создание оболочки, которая бы скрывала реализацию и предоставляла простые методы, является очевидным решением, но оно просто скрывает основную проблему.

Ответы [ 3 ]

6 голосов
/ 30 января 2012

Мне нравится подход 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, поскольку он будет иметь другое значение ключа.

Конечно, если вы хотите сохранить несколько объектов с одинаковым индексом (или восстановить несколько объектов, которые начинаются с того же ключа, начиная с восстановления, как в recovery *)1011 * и Key("a", "a", "b) при поиске Key("a", "a", "") это не сработает, но в любом случае вы не должны использовать Map и, вероятно, должны получить правильную базу данных.

0 голосов
/ 30 января 2012

Чистое решение (хотя изначально более громоздкое) заключается в нормализации ваших данных и загрузке их в оперативную память database. Затем, используя JPA , вы можете воспользоваться всеми отношениями OneToMany и получить коллекции объектов, которые имеют один или несколько ключей.

0 голосов
/ 30 января 2012

Возможно, вы захотите взглянуть на классы Google Guavas Collection - может быть, вы найдете подходящую реализацию, которую вы могли бы использовать «из коробки» вместо собственной?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...