【问题标题】:Looping over an array with alternating elements循环遍历具有交替元素的数组
【发布时间】:2018-06-12 12:04:35
【问题描述】:

很难用一句话概括这个问题。向您展示我想要的东西更容易。我有以下 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。它包含字段名称(键)和相应值的交替元素。所以例如“洛杉矶”有 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 方面还不够好,不知道如何做到这一点,或者任何其他超级智能的方式。

有什么建议,还是我应该只使用粗略的代码?

【问题讨论】:

    标签: java loops iterator


    【解决方案1】:

    如果你确定数组的长度,那么你应该一次读两遍:

    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 &lt; facetMT.size() - 1 条件以避免IndexOutOfBoundsException

    【讨论】:

    • 非常好。甚至不需要迭代器。
    【解决方案2】:

    如果你确定数组总是有偶数个元素,你可以在一次迭代中使用其中两个,比如

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

    【讨论】:

    • 我认为我不能影响 Solr 响应的格式(不过我同意这很奇怪)。不过,您的第一个示例看起来不错,这正是我认为应该以某种方式实现的。
    【解决方案3】:

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

    对于(int i=0;i<... facemt>

    替代值不适用于迭代器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      相关资源
      最近更新 更多