Как получить второй ключ и значение из вложенной мультикарты

#java #data-structures #multimap

#java #структуры данных #мультимап

Вопрос:

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

Это то, что я сделал до сих пор.

 Multimap<String, Multimap<String, List<ZoneOrders>>> dictionaryfinal;

Multimap<String, List<ZoneOrders>> dictionaryOrders;

dictionaryfinal = LinkedHashMultimap.create();
dictionaryOrders = LinkedHashMultimap.create();
  

затем я сохранил свои значения, как показано ниже, в цикле через ответ json:

 dictionaryOrders.put(zoneland, zoneorder);                  
dictionaryfinal.put(zonetype, dictionaryOrders);
  

Я могу легко получить набор ключей внешней мультикарты, используя

 dictionaryfinal.keySet().
  

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

Это то, что я пробовал, чтобы иметь доступ к внутренней мультикарте:

 Multimap<String, List<ZoneOrders>> ordinaryold  = LinkedHashMultimap.create();

ordinaryold = dictionaryfinal.get(item);
  

Но это не работает. Я получаю ошибку несовместимых типов. Не уверен, что я делаю неправильно.

Комментарии:

1. Что вы подразумеваете под «это не работает»? В чем ошибка?

2. Если вы используете мультикарту Guava, то в документации говорится, что get(Key k) метод возвращает коллекцию значений, поэтому, чтобы получить вложенную мультикарту, вам следует дополнительно выполнить итерацию в коллекцию, которую get возвращает. Кроме того, в описании LinkedHashMultimap говорится: Реализация Multimap, которая не допускает повторяющихся записей ключ-значение и возвращает коллекции, итераторы которых соответствуют порядку, в котором данные были добавлены в multimap. Так что в вашем случае это может быть неправильная структура данных

3. Можете ли вы привести пример нескольких внешних ключей и какие значения у вас есть для них, потому что я думаю, вы не понимаете, как на самом деле должна моделироваться структура.

Ответ №1:

Я думаю, что то, что вы хотите использовать, — это не a Multimap , а просто нормальное Map .

Используемый Multimap<K,V> вами (предположительно Guava , тот, потому что вы не сказали), по сути, является Map<K, Set<V>> .

Если вместо этого вы используете a Map , ваша вложенность должна работать:

 Map<String, Map<String, List<ZoneOrders>>> dictionaryfinal = new LinkedHashMap<>();

Map<String, List<ZoneOrders>> dictionaryOrders1 = new LinkedHashMap<>();
dictionaryOrders1.put(zoneland, zoneorder);      

dictionaryfinal.put(zonetype1, dictionaryOrders1);

Map<String, List<ZoneOrders>> dictionaryOrders2 = new LinkedHashMap<>();
dictionaryOrders2.put(zoneland2, zoneorder2);      

dictionaryfinal.put(zonetype2, dictionaryOrders2);

  

Затем, если вы получите элементы для zonetype1 , вы можете получить его вложенный Map просто:

  Map<String, List<ZoneOrders>> values1 = dictionaryfinal.get(zonetype1);   
  

values1 будет соответствовать zonetype1 только внутренней мультикарте.

Комментарии:

1. Это возвращает все значения во внутренней карте, а не те, которые связаны с ключом outmap. но я хочу получить только те, которые связаны с выбранным ключом

2. Нет, это не так. Он возвращает внутреннюю мультикарту, связанную zonetype1 только с ключом. Я добавил больше деталей к примеру.

3. это частично работает, так как я получаю список, содержащий один связанный с ним элемент. Но в случае, когда список должен содержать два или более, он игнорирует остальные и возвращает только последний добавленный элемент. кажется, второй элемент заменяет первый.

4. Как вы добавляете новые элементы во внутренний список ZoneOrders ? Вы должны получать список и добавлять к нему, если он существует. Если вы замените его новым списком из одного элемента, ваш предыдущий элемент будет потерян.

5. извините за плохое представление: «‘ if(dictionaryOrders.containsKey(zoneland)){dictionaryOrders.get(zoneland).addAll(zoneorder); }else{dictionaryOrders.put(zoneland, zoneorder); } if(dictionaryfinal.containsKey(zonetype)){dictionaryfinal.get(zonetype) .get(zoneland).addAll(zoneorder); }else{ dictionaryfinal.put(zonetype, dictionaryOrders); }»‘