Java Collections.Sort 不/不能按相同值分组

Java Collections.Sort doesn't / can't group by same value

enter image description here

我的代码是:

excelSheetRows -> 现有 JSONArray 数据。

           JSONArray sortedJsonArray = new JSONArray();
            List list = new ArrayList();
            for(int i = 0; i < excelSheetRows.length(); i++) {
               list.add(excelSheetRows.getJSONObject(i));
            }

            Collections.sort(list, new Comparator() {
               
            public int compare(JSONObject a, JSONObject b) {
                // TODO Auto-generated method stub
                  String str1 = new String();
                  String str2 = new String();
                  try {
                     str1 = (String)a.get(KEY_NAME);
                     str2 = (String)b.get(KEY_NAME);
                  } catch(JSONException e) {
                     e.printStackTrace();
                  }
                  return str1.compareTo(str2);
            }
            
            
            @Override
            public int compare(Object o1, Object o2) {
                // TODO Auto-generated method stub
                return 0;
            }
            });
            
            for(int i = 0; i < excelSheetRows.length(); i++) {
               sortedJsonArray.put(list.get(i));
            }

它运行成功了,但是sortedJsonArray没有把相同的名字组合在一起,例如:

a20190510 a20190529 a20190626 a20190510

文森特 文森特 vinagent33 文森特 文森特2222 文森特

请指教,我需要所有 'vincent' 或 'a20190510' 在一起,需要按同名升序分组,为什么它不相应地按名称分组???

问题是您正在初始化没有任何类型的列表。有关更多说明,请参阅 this answer

如果你这样做 List list = new ArrayList() 你的列表将包含 'Object' 的实现,因此当你排序时你将使用比较器和你没有定义的对象。

要解决您的问题,只需定义列表中的类型:

List<JSONObject> list = new ArrayList<>();

您还需要在比较器中定义类型:

Collections.sort(list, new Comparator<JSONObject>(){...}):

这样排序算法将使用您定义的比较方法。

此外,我可以建议您使代码更简单,如果您使用 lambda 函数,实际上只需一行就可以对它进行排序:

list.sort(Comparator.comparing(json -> json.get(KEY_NAME));