#java #json #object #enums #timezone
#Ява #json #объект #перечисления #Часовой пояс
Вопрос:
Я использую следующую карту для перечислений и добавляю enum
, как показано ниже:
final Maplt;String, Objectgt; enums = new HashMaplt;gt;(); enums.put("ZoneIds", gmtValues());
ZoneIds
Перечисление имеет Listlt;Stringgt;
значение, возвращенное этим методом:
private static Listlt;Stringgt; gmtValues() { return ... // code omitted for brevity } private static Listlt;Stringgt; gmtNames() { return ... // code omitted for brevity }
Однако я хочу передать другой список в том же объекте, а затем получить эти 2 переданных значения во внешнем интерфейсе как ZoneIds.value
и ZoneIds.name
. Итак, как я могу это сделать?
Комментарии:
1. Составить список списков? Или, возможно, лучше, создайте свой собственный класс объектов, содержащих два списка.
2. Я не могу измениться
final Maplt;String, Objectgt; enums = new HashMaplt;gt;();
. Итак, как я могу решить проблему, не меняя этого?3. Именно так. Ваш пользовательский объект , содержащий два списка, будет подклассом
Object
, поэтому так же, как вы можете поместить список на свою карту, вы также можете поместить свой пользовательский объект.
Ответ №1:
Возможны следующие варианты:
"ZoneIds"
представляет собой список списков,name
value
правильно упорядоченных по индексу
{"ZoneIds": [["name1", "value1"], ["nameN", "valueN"]]}
Затем имена/значения объединяются таким образом, предполагая, что размеры списков, возвращаемых gmtNames()
и gmtValues()
равны:
Listlt;Stringgt; names = gmtNames(); Listlt;Stringgt; values = gmtValues(); Listlt;Listlt;Stringgt;gt; nameValueList = IntStream.range(0, Math.min(names.size(), values.size())) .mapToObj(i -gt; Arrays.asList(names.get(i), values.get(i))) .collect(Collectors.toList()); enums.put("ZoneIds", nameValueList);
"ZoneIds"
это список карт:
{"ZoneIds": [{"name":"name1", "value":"value1"}, {"name":"nameN", "value":"valueN"}]}
Listlt;Maplt;String, Stringgt;gt; listMaps = IntStream.range(0, Math.min(names.size(), values.size())) .mapToObj(i -gt; Map.of("name", names.get(i), "value", values.get(i))) .collect(Collectors.toList()); enums.put("ZoneIds", listMaps);
- Простая карта, с ключом, взятым из
gmtNames()
списка:
{"ZoneIds": {"name1":"value1", "nameN":"valueN"}}
Maplt;String, Stringgt; nameValueMap = IntStream.range(0, Math.min(names.size(), values.size())) .boxed() .collect(Collectors.toMap( names::get, // key from names list values::get, // value from values list (v1, v2) -gt; v1, // merge function in case of conflicts LinkedHashMap::new // keep insertion order )); enums.put("ZoneIds", nameValueMap);