循环使用交替元素的数组

时间:2018-06-12 12:04:35

标签: java loops iterator

很难用一句话总结这个问题。它更容易向您展示我想要的东西。我有一个Solr查询的以下响应:

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

我使用GSON解析这个JSON数据并获得一个包含数组" city"的JsonArray。它包含字段名称(键)的交替元素和相应的值。所以例如我们为" Los Angeles"提供了13322次点击。我想迭代这个数组以获得它包含的key = value对。

我可以为这项任务考虑一些简单的解决方案,例如

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 :(得分:2)

如果您确定阵列的长度,那么您应该在一个读取两次:

const vehicles = [{
    id: 1,
    make: 'BMW',
    model: '100',
    year: 1994
  },
  {
    id: 2,
    make: 'Audi',
    model: '1 Series M',
    year: 1994
  }
]

const output = vehicles.map(car => `${car.make} ${car.model} ${car.year}`)
console.log(output);

请注意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

答案 1 :(得分:1)

如果您确定该数组总是包含大量元素,您可以在一次迭代中使用其中两个元素,如

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());
}

答案 2 :(得分:0)

在这种情况下,使用for循环索引

For(int i = 0; i&lt; ... FaceMT [i] =改变了价值。

Alterate值不适用于

的迭代器