将JSON数组值存储在HashMap中并删除重复项

时间:2014-09-15 08:39:42

标签: java android json hashmap

我有一个JSON响应,看起来像这样(它与用户不同)

{
 "success": true, "data": 
 [
    {
    "mandatory_tag": "My Company",
    "id": "topic_1408946825893148"  
    },
    {
    "mandatory_tag": "Partners",
    "id": "topic_1408946942491149",
    },
    {
    "mandatory_tag": "Industry",
    "id": "topic_1408946996510150",
    }, 
    {
    "mandatory_tag": "Competitors",
    "id": "topic_1409210454810358",
    }, 
    {
    "mandatory_tag": "Competitors",
    "id": "topic_1408947133657152"
    }, 
    {
    "mandatory_tag": "Competitors",
    "id": "topic_1408947071457151",
    }, 
    {
    "mandatory_tag": "Competitors",
    "id": "topic_1409210621754362",
    }, 
    {
    "mandatory_tag": "Competitors",
    "id": "topic_1409210704390363",
    }, 
    {
    "mandatory_tag": "Competitors",
    "id": "topic_1409210794791364"
    }
  ]
}

我正在解析它并尝试存储在HashMap中,但键值是重复的。任何人都可以建议我如何将所有具有相同mandatory_tag的id存储在一个数组中?

我是新手,所以请考虑......谢谢

                  try
                    { 
                        JSONObject jsonMain = new JSONObject(jsonString);
                        JSONArray dataArray = jsonMain.getJSONArray("data");
                        for(int i = 0; i < dataArray.length(); i++)
                        {
                            JSONObject tagObject = dataArray.getJSONObject(i);
                            String mandatory_tag = tagObject.getString("mandatory_tag");
                            String id = tagObject.getString("id");
                            List<String> arrayID = new ArrayList<String>();
                            if(myMap.containsKey(mandatory_tag))
                            {
                                arrayID.add(id);
                                myMap.put(mandatory_tag, arrayID);
                            } else
                            {
                                List<String> newArrayID = new ArrayList<String>();
                                newArrayID.add(id);
                                myMap.put(mandatory_tag, newArrayID);
                            }
                     }

好吧,我现在卡住了这个......好的逻辑就好了..

4 个答案:

答案 0 :(得分:1)

hashmap允许您存储键值项。我建议HashMap的类型为<String,List<String>>,这样您就可以在1键下的同一列表中存储具有相同mandatory_tag的项目。

例如

HashMap<String,List<String>> myMap = new HashMap<String,List<String>>();

if (myMap.containsKey(mandatory_tag)) {
    List<String> values = myMap.get(mandatory_tag);
    if (values!=null) {
       values.add(id)
    } else {
        values = new List<String>();
        values.add(id);
    }
}

<强>更新

正如我在下面的评论中所写,除了你添加的内容有错误

List<String> arrayID = new ArrayList<String>();
                        if(myMap.containsKey(mandatory_tag))
                        {
                            arrayID.add(id);
                            myMap.put(mandatory_tag, arrayID);
                        }

你在这里做的是,如果地图已经包含你要用一个只包含1个值的新列表替换与该键相关联的值的键。您需要做的是更新已存在的值列表。检查下面的代码,确保您了解问题。这些是编程的基础,你需要了解你正在做的事情的逻辑。

//Somewhere you have declared your HashMap
HashMap<String,List<String>> myMap = new HashMap<String,List<String>>();

//then we continue with your excerpt  
try { 
JSONObject jsonMain = new JSONObject(jsonString);
JSONArray dataArray = jsonMain.getJSONArray("data");


for(int i = 0; i < dataArray.length(); i++) {
    JSONObject tagObject = dataArray.getJSONObject(i);
    String mandatory_tag = tagObject.getString("mandatory_tag");
    String id = tagObject.getString("id");

    if(myMap.containsKey(mandatory_tag)) {
         List<String> arrayID = myMap.get(mandatory_tag);
         arrayID.add(id);
    } else {
         List<String> newArrayID = new ArrayList<String>();
         newArrayID.add(id);
         myMap.put(mandatory_tag, newArrayID);
    }

}

答案 1 :(得分:0)

使用变量TagValuesmandatory_tag创建一个名为id(或您想要的任何名称)的POJO,然后创建一个ArrayList<TagValues>,您可以在其中存储所有对象。

答案 2 :(得分:0)

感谢您的回复,但在您的帮助下,我得到了解决方案

`HashMap<String,List<String>> myMap = new HashMap<String,List<String>>();    
for(int i = 0; i < dataArray.length(); i++)
    {
        JSONObject tagObject = dataArray.getJSONObject(i);
        String mandatory_tag = tagObject.getString("mandatory_tag");
        String id = tagObject.getString("id");
        if(myMap.isEmpty())
        {
            arrayID = new ArrayList<String>();
            arrayID.add(id);
            myMap.put(mandatory_tag, arrayID);
        } 
        else if(myMap.containsKey(mandatory_tag))
        {
            arrayID.add(id);
            myMap.put(mandatory_tag, arrayID);
        }
        else
        {
            arrayID = new ArrayList<String>();
            arrayID.add(id);
            myMap.put(mandatory_tag, arrayID);
        }
    }`

答案 3 :(得分:0)

在这些情况下,我想使用自定义HashMap

public MMap getData() {
    MMap result = new MMap();
    JSONArray array = getJSONArrayFromTotalJSON();
    for (int i = 0; i < array.length(); i++) {
        JSONObject obj = array.getJSONObject(i);
        String mtag = obj.getString(MANDATORY_TAG);
        String id = obj.getString(ID);
        result.put(mtag, id);
    }
    return result;
}

public class MMap extends HashMap<String, List<String>> {
    public void put(String key, String value) {
        if (!this.containsKey(key))
            this.put(key, new ArrayList<String>());
        this.get(key).add(value);
    }
}