[英]How to sort List<Map<String,String>> by key1 descending order and key2 ascending order if key1 has same values
[英]How to sort List of Map String in ascending order
我有一个HashMap列表,我想在Java中按升序对其进行排序。
我正在使用自定义比较器来实现逻辑,但是失败了。 它只是基于Map键对列表进行分组。 它没有对列表进行完全排序。
我的代码看起来像-
public class ListMap {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
List<HashMap<String, String>> list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
int value = randInt(1, 20);
long timeInMillis = cal.getTimeInMillis();
HashMap<String, String> mp = new HashMap<>();
mp.put("" + value, "Values" + value + ":" + timeInMillis);
list.add(mp);
}
Collections.sort(list, new Comparator<Map<String, String>>() {
@Override
public int compare(Map<String, String> map1,
Map<String, String> map2) {
String val1 = "";
String val2 = "";
for (Map.Entry<String, String> entry : map1.entrySet()) {
val1 = entry.getKey();
}
for (Map.Entry<String, String> entry : map2.entrySet()) {
val2 = entry.getKey();
}
return val1.compareTo(val2);
}
});
for (Map<String, String> hashMap : list) {
for (Map.Entry<String, String> entry : hashMap.entrySet()) {
System.out.println(entry.getKey() + "/" + entry.getValue());
}
}
}
public static int randInt(int min, int max) {
Random rand = new Random();
int randomNum = rand.nextInt((max - min) + 1) + min;
return randomNum;
}
}
它输出输出-
10/Values10:1437660285301
11/Values11:1437660285301
11/Values11:1437660285301
11/Values11:1437660285301
13/Values13:1437660285301
13/Values13:1437660285301
15/Values15:1437660285301
15/Values15:1437660285301
15/Values15:1437660285301
16/Values16:1437660285301
17/Values17:1437660285301
18/Values18:1437660285301
18/Values18:1437660285301
19/Values19:1437660285301
19/Values19:1437660285301
2/Values2:1437660285301
3/Values3:1437660285301
4/Values4:1437660285301
6/Values6:1437660285301
6/Values6:1437660285301
它按键对值进行分组,但是我希望像上面的示例一样整个排序列表。
我期望2,然后3,然后4,然后继续。
您正在基于String
类型的键进行比较。 比较将按词典顺序进行,即12
小于2
。
您需要在比较器中将键比较为Integers
:
Collections.sort(list, new Comparator<Map<String, String>>() {
@Override
public int compare(Map<String, String> map1,
Map<String, String> map2) {
String val1 = "";
String val2 = "";
for (Map.Entry<String, String> entry : map1.entrySet()) {
val1 = entry.getKey();
}
for (Map.Entry<String, String> entry : map2.entrySet()) {
val2 = entry.getKey();
}
return Integer.valueOf(val1).compareTo(Integer.valueOf(val2));
}
});
只需修改您的比较器,即可将密钥字符串转换为整数:
new Comparator<Map<String, String>>() {
@Override
public int compare(Map<String, String> map1,
Map<String, String> map2) {
String val1 = "";
String val2 = "";
for (Map.Entry<String, String> entry : map1.entrySet()) {
val1 = entry.getKey();
}
for (Map.Entry<String, String> entry : map2.entrySet()) {
val2 = entry.getKey();
}
int key1 = Integer.parseInt(val1);
int key2 = Integer.parseInt(val2);
return key1.compareTo(key2);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.