Java 将JSON中的数据分组并显示在列表上

Java 将JSON中的数据分组并显示在列表上,java,json,grouping,Java,Json,Grouping,我有一个JSON数据,如下所示: { "items": [ { "kodeHp": "C-1", "firstName": "iman", "lastName": "firmansyah", "email": "ggag@gmail.com" },

我有一个JSON数据,如下所示:

{
  "items": [
    {
      "kodeHp": "C-1",
      "firstName": "iman",
      "lastName": "firmansyah",
      "email": "ggag@gmail.com"
    },
    {
      "kodeHp": "C-2",
      "firstName": "dini",
      "lastName": "yyyy",
      "email": "ggag@gmail.com"
    },
    {
      "kodeHp": "C-1",
      "firstName": "tanu",
      "lastName": "xxxxx",
      "email": "bb@gmail.com"
    },
{
iman: C1
tanu: C1
dini: C2
}

我想在列表上显示“firstName”,但按“kodeHp”对象排序。我的清单如下:

{
  "items": [
    {
      "kodeHp": "C-1",
      "firstName": "iman",
      "lastName": "firmansyah",
      "email": "ggag@gmail.com"
    },
    {
      "kodeHp": "C-2",
      "firstName": "dini",
      "lastName": "yyyy",
      "email": "ggag@gmail.com"
    },
    {
      "kodeHp": "C-1",
      "firstName": "tanu",
      "lastName": "xxxxx",
      "email": "bb@gmail.com"
    },
{
iman: C1
tanu: C1
dini: C2
}

这就是我尝试过的:

private String parseItems(String jsonResponse) {
        ArrayList<HashMap<String,String>> list = new ArrayList<>();

        try {
            JSONObject jObj = new JSONObject(jsonResponse);
            JSONArray jArray = jObj.getJSONArray("items"); //edited on gscript

            for(int i = 0; i < jArray.length(); i++){
                JSONObject jo = jArray.getJSONObject(i);
                String kodeHp = jo.getString("kodeHp");
                String firstName = jo.getString("firstName");
                String lastName = jo.getString("lastName");
                String email = jo.getString("email");

                HashMap<String, String> item = new HashMap<>();
                if (!item.containsKey(kodeHp)){
                    item.get(kodeHp);
                }
                item.put("firstName", firstName);
                item.put("lastName", lastName);
                item.put("email",email);
                item.put("kodeHp", kodeHp);
                list.add(item);

            }
        } catch (JSONException e){

        }
        adapter = new SimpleAdapter(this, list, R.layout.item_list_row,
                new String[]{"firstName", "kodeHp"}, new int[] {R.id.TvFirstName,R.id.TvKodeHp});

        listView.setAdapter(adapter);
        loading.dismiss();
        return jsonResponse;
    }
私有字符串解析项(字符串jsonResponse){
ArrayList=新建ArrayList();
试一试{
JSONObject jObj=新的JSONObject(jsonResponse);
JSONArray jArray=jObj.getJSONArray(“items”);//在gscript上编辑
for(int i=0;i

它可以显示我的JSON数据,但还没有按我想要的方式排序。有什么建议吗?

要对列表进行排序,您可以与适当的
比较器一起使用,例如使用:

请注意,这将按
“kodeHp”
的值按字母顺序排序。还请注意,如果输入数据中可能存在
null
值,则必须添加对这些值的处理


如果您需要Java8之前的解决方案,例如,对于旧的Android版本,您必须创建一个老式的匿名类,例如:

list.sort(new Comparator<Map<String,String>>() {
    @Override
    public int compare(Map<String,String> o1, Map<String,String> o2) {
        return o1.get("kodeHp").compareTo(o2.get("kodeHp"));
    }
});
list.sort(新的比较器(){
@凌驾
公共整数比较(映射o1,映射o2){
返回o1.get(“kodeHp”)。与(o2.get(“kodeHp”))进行比较;
}
});

要对列表进行排序,您可以与适当的
比较器一起使用,例如使用:

请注意,这将按
“kodeHp”
的值按字母顺序排序。还请注意,如果输入数据中可能存在
null
值,则必须添加对这些值的处理


如果您需要Java8之前的解决方案,例如,对于旧的Android版本,您必须创建一个老式的匿名类,例如:

list.sort(new Comparator<Map<String,String>>() {
    @Override
    public int compare(Map<String,String> o1, Map<String,String> o2) {
        return o1.get("kodeHp").compareTo(o2.get("kodeHp"));
    }
});
list.sort(新的比较器(){
@凌驾
公共整数比较(映射o1,映射o2){
返回o1.get(“kodeHp”)。与(o2.get(“kodeHp”))进行比较;
}
});

您总是为
item
创建一个新的HashMap,因此
item.containsKey(kodeHp)
在下一行永远不可能为真。此外,尝试获取您刚刚确认为不存在的值也没有意义。它应该是什么?因为如果我删除这些行,我的应用程序最终会崩溃,首先你可以在创建HashMap后删除这3行,因为它们什么都不做。(当找不到键时,只返回
null
。为什么不从json字符串创建对象,然后对它们进行排序?我认为这样会更干净。您总是为
item
创建一个新的HashMap,因此
item.containsKey(kodeHp)
在下一行永远不可能为真。此外,尝试获取您刚刚确认为不存在的值也没有意义。应该是什么?因为如果我删除这些行,我的应用程序最终会崩溃,首先,您可以在创建HashMap后删除这3行,因为它们什么都不做。(当找不到密钥时,只返回
null
。为什么不从json字符串创建对象,然后对它们进行排序呢?我认为这样会更干净。如何在没有lambda表达式的情况下使用它?我在两个设备中进行了尝试,第一个设备的API级别为23,第二个设备的API级别为29。之后,它在API级别23上不起作用寻找一些解决方案只是因为lambda表达式不能与API@SeptiaDiniRahayu一起使用,所以添加了一个版本,就像我们在过去“一切”都是对象时所做的那样;-)不管怎样,如果没有lambda表达式,如何使用它呢?我已经在2个设备中试用过,第一个是API级别23,第二个是API级别29。它在API级别23上不起作用,在寻找一些解决方案之后,它只是因为lambda表达式不能与API一起使用@SeptiaDiniRahayu添加了一个版本,就像我们在旧版本中所做的那样“一切”都是对象的日子;-)