1: 集合排序需要用的 List.sort();方法,所以要把HashMap转为List
map.entrySet:
就是把(key-value)作为一个整体一对一对地存放到Set集合当中;
Set类型应为:Set<Map.Entry<Integer, User>>
Set<Map.Entry<Integer, User>> entrySet = map.entrySet(); ★ 先把HashMap转为Set ★
List<Map.Entry<Integer, User>> list = new ArrayList<>(entrySet); ★ 在=再把Set转为list ★
2:排序方法中Comparator的o1与o2值,就是集合中两个相比较的元素(或则此元素的某个属性)
- o1-o2是正序;
- o2-o1是倒序;
- o1与o2相等时,表示两个元素的比较条件想等了,你可以在指定其他的比较条件
list.sort(new Comparator<Map.Entry<Integer, User>>() {
@Override
public int compare(Map.Entry<Integer, User> o1, Map.Entry<Integer, User> o2) {
★ 首先按年龄正序排列 ★
int i = o1.getValue().getAge() - o2.getValue().getAge();
★ 如果年龄相等,就按id的正序排列 ★
if (i == 0) {
return o1.getValue().getId() - o2.getValue().getId();
}
return i;
}
});
3:HashMap是无序的所以需要它的子类LinkedHashMap来接收排好顺序的集合
- 先创建一个LinkedHashMap作为返回值;
- 然后对数据进行排序;
- 排序完把数据装进LinkedHashMap中;
private static Map<Integer, User> sort(Map<Integer, User> map) {
LinkedHashMap<Integer, User> linkedHashMap = new LinkedHashMap<>();
/* 此处是排序操作 */
for (int i = 0; i < list.size(); i++) {
linkedHashMap.put(list.get(i).getKey(), list.get(i).getValue());
}
return linkedHashMap;
}
源码:
public static void main(String[] args) {
// 需要排序的map集合
Map<Integer, User> map = new HashMap<>();
map.put(1, new User("张三", 1, 0));
map.put(2, new User("李四", 2, 1));
map.put(3, new User("刘罗锅", 3, 2));
map.put(4, new User("李大爷", 4, 3));
map.put(5, new User("王二婶", 5, 6));
map.put(6, new User("老王", 5, 5));
System.out.println("未排序的Map:" + map);
//把排序完的linkedHashMap赋值给map1
Map<Integer, User> map1 = sort(map);
System.out.println("排序后的Map:" + map1);
}
// 排序的方法(返回值为HashMap的子类LinkedHashMap; 原因:HashMap无序;LinkedHashMap有序)
private static Map<Integer, User> sort(Map<Integer, User> map) {
//先创建一个LinkedHashMap作为返回值
LinkedHashMap<Integer, User> linkedHashMap = new LinkedHashMap<>();
//map.entrySet:就是把(key-value)作为一个整体一对一对地存放到Set集合当中
Set<Map.Entry<Integer, User>> entrySet = map.entrySet();
//ArrayList构造函数接受一个Collection类型的参数,Set是Collection的子类,所以可以把Set对象直接放入转成list
List<Map.Entry<Integer, User>> list = new ArrayList<>(entrySet);
//list对象可以通过sort方法进行排序
list.sort(new Comparator<Map.Entry<Integer, User>>() {
@Override
public int compare(Map.Entry<Integer, User> o1, Map.Entry<Integer, User> o2) {
// o1-o2是正序;o2-o1是倒序;
int i = o1.getValue().getAge() - o2.getValue().getAge();
if (i == 0) { //当i==0时说明上面的排序条件相等了,你可以通过其他条件来排序这个相等的元素;
return o1.getValue().getId() - o2.getValue().getId();
}
return i;
}
});
for (int i = 0; i < list.size(); i++) { //排序完成,把list添加到刚刚创建的linkedHashMap中
linkedHashMap.put(list.get(i).getKey(), list.get(i).getValue());
}
return linkedHashMap;
}
结果:
未排序的Map:{1=User@1218025c, 2=User@816f27d, 3=User@87aac27, 4=User@3e3abc88, 5=User@6ce253f1, 6=User@53d8d10a}
排序后的Map:{1=User@1218025c, 2=User@816f27d, 3=User@87aac27, 4=User@3e3abc88, 6=User@53d8d10a, 5=User@6ce253f1}
Ps:排序中还可以比较字符串进行排序(比较的是字符串长度):
使用compareTo方法对字符串排序,compareTo返回一个int值;
用法: str1.compareTo(str2);
- 返回值 等于0 说明str1==str2
- 返回值 小于0 str1<str2
- 返回值 大于0 说明str1>str2
例如:
String s1 = "String";
String s2 = "String";
String s3 = "String123";
int result = s1.compareTo( s2 );
System.out.println(result);
result = s2.compareTo( s3 );
System.out.println(result);
result = s3.compareTo( s1 );
System.out.println(result);
结果:
0
-3
3