很难用一句话总结这个问题。它更容易向您展示我想要的东西。我有一个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方面不够好知道如何做到这一点,或任何其他超级方式。
有任何建议,还是我应该使用原始代码?
答案 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值不适用于
的迭代器