【问题标题】:hasNext skips first value in HashMaphasNext 跳过 HashMap 中的第一个值
【发布时间】:2013-09-26 16:56:33
【问题描述】:

我正在尝试使用来自远程服务器的数据实现可扩展的列表视图。我已经涵盖了 JSON 部分。我的示例返回了三个值集(通过在原始 JSON 响应中检查 logcat 来确认)。我现在的问题是在将 JSON 返回分为标头和子数据时,第一个值集被跳过。我的代码如下:

int lisDataHeaderCounter = 0;
String searchKey;

for (int i = 0; i < components.length(); i++) {                     
    List<String> component_value = new ArrayList<String>();

    searchKey = main_components.get(i);
    if (!listDataHeader.contains(searchKey)) {
        listDataHeader.add(searchKey);

        Iterator<Map.Entry<String, String>> entries = sub_components.entrySet().iterator(); 

        while (entries.hasNext()) {
            Map.Entry<String, String> entry = entries.next();

            Log.d("getValue() ", "+ " + entry.getValue());
            if (searchKey == entry.getKey())
                component_value.add(entry.getValue());
        }

        listDataChild.put(listDataHeader.get(lisDataHeaderCounter), component_value);
        lisDataHeaderCounter++;
    }                       
}

我也试过下面的代码,结果还是一样。

for (Map.Entry<String, String> entry : sub_components.entrySet()) {
    if (searchKey == entry.getKey())
        component_value.add(entry.getValue());
}

以下是上述代码正在处理的 JSON 响应示例:

[{"activity_code":"1","activity_name":"Midterm Exam"},
 {"activity_code":"1","activity_name":"Final Exam"},
 {"activity_code":"2","activity_name":"Project"}]

使用当前代码,在for循环中,searchKey的第一个值为'1'。当我放置一个 Log.d();在 while 循环中检查读取的第一个值是什么,我发现它是“期末考试”而不是“期中考试”。有没有办法让我在第一个数据集进入 while 循环之前获取它的值?

这是我为确保将第一个值包含到 sub_components 所做的解决方法。但我想它看起来并不整洁。如果有人有更好的解决方案,请随时分享。

for (int i = 0; i < components.length(); i++) {
    JSONObject c = components.getJSONObject(i);

    String formula_code = c.getString(TAG_FORMULA_CODE);
    String component_name = c.getString(TAG_ACTIVITY_NAME);

    main_components.add(formula_code);
    sub_components.put(formula_code, component_name);

    if (!listDataHeader.contains(formula_code))
        listDataHeader.add(formula_code);
    if (i == 0) {
        component_value.add(component_name);
    }
}

for (int i = 0; i < listDataHeader.size(); i++) {
    for (Map.Entry<String, String> entry : sub_components.entrySet()) {
        if (listDataHeader.get(i) == entry.getKey())
            component_value.add(entry.getValue());
    }

    listDataChild.put(listDataHeader.get(i), component_value);
    component_value = new ArrayList<String>();
}

【问题讨论】:

  • 您是否尝试过使用 do while 循环?这将始终在开始迭代之前计算第一个值。
  • 跳过,您是否仅仅意味着您的ifthen 部分没有被执行?由于您将Strings 与==searchKey 是一个字符串)进行比较,因此即使字符串具有相同的内容,测试也可能会失败。见How do I compare strings in Java?
  • *sirFunkenstine,我不知道如何使用 do-while 循环实现 Hashmap 的迭代。你能给个样品吗? *Joshua Taylor,如果将其与 2D 数组进行比较,for 循环会开始读取 [0][0] 到 [n][0] 上的数据。 while 循环应该首先读取 [0][1],然后转到 [1][1]。还是不明白为什么[0][1]被跳过了。
  • 既然可以使用component_value.add(sub_components.get(searchKey)),为什么还需要遍历HashMap? sub_components 是什么? JSON 中的第一个条目?从结构上看,它不可能是整个 JSON(从 StringString 的映射)。我猜您的错误可能在于第一行和第二行 JSON 行具有相同的activity_code
  • 从 JSON 响应中,我试图将可扩展列表视图所需的数据分开,其中 activity_code 是标题,而活动名称是子项。希望这会导致标题“1”有孩子(“期中考试”和“期末考试”),而标题“2”只有“项目”作为孩子。

标签: java json map


【解决方案1】:

我看不出两者有一个错误,但也许是searchKey == entry.getKey(),可能必须是searchKey.equals(entry.getKey()),但我需要查看更多代码才能确定。

【讨论】:

  • 我尝试了 searchKey.equals(entry.getKey()) 但结果相同。我提供的代码是处理数据与 JSON 响应的标题和子级分离的代码。因此,一旦收到 JSON 响应,接下来将处理它们。其余代码只是我从我一直在使用的教程中获得的非常标准的代码。
猜你喜欢
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
相关资源
最近更新 更多