хранение hashMap в hashMap - PullRequest
       5

хранение hashMap в hashMap

18 голосов
/ 20 февраля 2011

Я читаю данные из текстового файла и хочу сохранить HashMap в другом HashMap.

HashMap<string,HashMap<string,value>>

как хранить данные и получать их? любой пример кода будет оценен ... спасибо тебе

Ответы [ 5 ]

37 голосов
/ 20 февраля 2011

Пример:

Создание и заполнение карт

Map<String, Map<String, Value>> outerMap = new HashMap<String, HashMap<String, Value>>();
Map<String, Value> innerMap = new HashMap<String, Value>();    
innerMap.put("innerKey", new Value());

Хранение карты

outerMap.put("key", innerMap);

Получение карты и ее значений

Map<String, Value> map = outerMap.get("key");
Value value = map.get("innerKey");
7 голосов
/ 20 февраля 2011

Создание двух простых хэш-карт: InnerMap и OuterMap

    HashMap<String, HashMap<String, String>> outerMap = new HashMap<String, HashMap<String,String>>();
    HashMap<String, String> innerMap = new HashMap<String, String>();

Заполнение HashMaps

    innerMap.put("InnerKey", "InnerValue");
    outerMap.put("OuterKey", innerMap);

Получение значений из HashMaps

    String value = ((HashMap<String, String>)outerMap.get("OuterKey")).get("InnerKey").toString();
    System.out.println("Retreived value is : " + value);
3 голосов
/ 20 февраля 2011

Вы получаете что-то похожее на 2-х мерный HashMap, так сказать.Это означает, что вам нужно 2 String для хранения значения, а также для его получения.

Вы можете, например, написать класс, чтобы обернуть эту сложность, как этот (непроверенный код):

public class HashMap2D<T> {
    private HashMap<String,HashMap<String,T>> outerMap;

    public HashMap2D() {
        outerMap = new HashMap<String,HashMap<String,T>>();
    }

    public void addElement(String key1, String key2, T value) {
        innerMap=outerMap.get(key1);
        if (innerMap==null) {
            innerMap = new HashMap<String,T>();
            outerMap.put(key1,innerMap);
        }
        innerMap.put(key2,value);
    }

    public T getElement(String key1, String key2) {
        Hashmap innerMap = outerMap.get(key1);
        if (innerMap==null) {
            return null;
        }
        return innerMap.get(key2);
    }
}

Если вы хотите, чтобы методы обрабатывали несколько данных одновременно, это более сложно, но следует тем же принципам.

2 голосов
/ 20 февраля 2011

Это решит ту же проблему, используя одну карту (хотя это не дает прямого ответа на ваш вопрос), сведя две вложенные карты в одну большую карту, используя двойной ключ.

public class Key2D{
  private final String outer;
  private final String inner;

  public Key2D(String outer, String inner){
    this.outer = outer;
    this.inner = inner;
  }

  //include default implementations for
  //Object.equals(Object) and Object.hashCode()
  //Tip: If you're using Eclipse it can generate
  //them for you.
}

Затем просто создайте одну карту с двойным ключом:

Map<Key2D, Value> map = new HashMap<Key2D, Value>();
map.put(new Key2D("outerKey", "innerKey"), "Value");
map.get(new Key2D("outerKey", "innerKey")); // yields "Value"

Это дает более короткое решение. По производительности, наверное, примерно так же. Производительность памяти, вероятно, немного лучше (хотя я только догадываюсь).

0 голосов
/ 20 февраля 2011

HashMap в HashMap вызовет проблемы с читабельностью, особенно когда он выходит за пределы двух уровней. Я предполагаю, что когда вы читаете данные из текстового файла, вы хотите классифицировать входные данные из строк и столбцов, которые должны быть похожи на многоуровневые категории или категории внутри категории. Если вы можете опубликовать пример данных и свое намерение, я мог бы привести пример пользовательского класса.

public class Category {
  private List<Category> subCategories;
  private List<Item> items;
}

Приведенная выше структура данных поможет вам решить любой уровень вложенности при классификации данных. Этот пример относится к классификации товаров в магазине.

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