Добавьте несколько элементов в объект в Java

#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);