Цикл по массиву с чередующимися элементами - PullRequest
0 голосов
/ 12 июня 2018

Сложно суммировать вопрос в одном предложении.Проще показать, чего я хочу.У меня есть следующий ответ на запрос Solr:

{
  .....
  },
  "facet_counts":{
    "facet_queries":{},
    "facet_fields":{
      "city":[
        "New York",23258,
        "Los Angeles",13322,
        "Paris",1189]},
    "facet_ranges":{},
    "facet_intervals":{},
    "facet_heatmaps":{}}}

Я использую GSON для анализа этих данных JSON и получения JsonArray, содержащего массив «city».Он содержит чередующиеся элементы для имени поля (ключа) и соответствующего значения.Например, у нас есть 13322 хита для "Лос-Анджелеса".Я хочу перебрать этот массив, чтобы получить содержащиеся в нем пары ключ = значение.

Я могу придумать несколько простых решений для этой задачи, например

boolean isKey = true;
String key;
String val;
for(JsonElement je : facetMT) {
    if(isKey) {
        key = je.getAsString();
        isKey = false;
    } else {
        val = je.getAsString();
        resultMap.add(key,val);
        isKey = true;
    }

}

или любойДругой способ различать нечетные и четные элементы, например, проверка делимости на 2.

Но это кажется грубым.Я уверен, что у Java есть какой-то другой элегантный способ сделать это, например, работать с итератором и пропускать все остальные элементы.Но я не достаточно хорош в Java, чтобы знать, как это сделать, или каким-либо другим суперсумным способом.

Есть предложения, или мне просто пойти с грубым кодом?

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Если вы уверены в длине массива, вам следует прочитать дважды в один:

for(int i = 0; i < facetMT.size() - 1; i = i + 2) {
   JsonElement key = facetMT.get(i).getAsString();
   JsonElement value= facetMT.get(i + 1).getAsString();
   resultMap.add(key,val);
}

Обратите внимание на условие i < facetMT.size() - 1, чтобы избежать IndexOutOfBoundsException

0 голосов
/ 12 июня 2018

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

Iterator<JsonElement> it = facetMT.iterator();
while (it.hasNext()) {
    // iterate over two elements
    resultMap.put(it.next().getAsString(), it.next().getAsString());
}

Но, если честно, правильный ответ будет приводить к получению результатов в виде массиваобъекты типа

  "city":[
    {"cityName":"New York", "amount":23258},
    {"cityName":"Los Angeles", "amount":13322},
    {"cityName":"Paris", "amount":1189}
  ]

вместо того, что есть у вас сейчас

  "city":[
    "New York",23258,
    "Los Angeles",13322,
    "Paris",1189
  ]

Таким образом ваш код может выглядеть следующим образом:

for (JsonElement jsonElement : facetMT) {
    JsonObject obj = (JsonObject)jsonElement;
    resultMap.put(obj.get("cityName").getAsString(), 
                  obj.get("amount").getAsString());
}
0 голосов
/ 12 июня 2018

В этом случае используйте цикл for с индексами

For (int i = 0; i <... FaceMT [i] = измененное значение. </p>

Изменение значения не работает ситератор для

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