#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); }»‘