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