Map排序的方式有很多种,这里记录下自己总结的两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value)。
1、按键排序
jdk内置的java.util包下的TreeMap<K,V>既可满足此类需求,向其构造方法TreeMap(Comparator< super K> comparator) 传入我们自定义的比较器即可实现按键排序。
实现代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public
class
MapSortDemo {
????``public
static
void
main(String[] args) {
????????``Map<String, String> map =
new
TreeMap<String, String>();
????????``map.put(``"KFC"``,
"kfc"``);
????????``map.put(``"WNBA"``,
"wnba"``);
????????``map.put(``"NBA"``,
"nba"``);
????????``map.put(``"CBA"``,
"cba"``);
????????``Map<String, String> resultMap = sortMapByKey(map);???
//按Key进行排序
????????``for
(Map.Entry<String, String> entry : resultMap.entrySet()) {
????????????``System.out.println(entry.getKey() +
" "
+ entry.getValue());
????????``}
????``}
????
????``/**
?????``* 使用 Map按key进行排序
?????``* @param map
?????``* @return
?????``*/
????``public
static
Map<String, String> sortMapByKey(Map<String, String> map) {
????????``if
(map ==
null
|| map.isEmpty()) {
????????????``return
null``;
????????``}
????????``Map<String, String> sortMap =
new
TreeMap<String, String>(
????????????????``new
MapKeyComparator());
????????``sortMap.putAll(map);
????????``return
sortMap;
????``}
}
比较器类
1
2
3
4
5
6
7
8
class
MapKeyComparator
implements
Comparator<String>{
????``@Override
????``public
int
compare(String str1, String str2) {
????????
????????``return
str1.compareTo(str2);
????``}
}
2、按值排序
按值排序就相对麻烦些了,貌似没有直接可用的数据结构能处理类似需求,需要我们自己转换一下。
Map本身按值排序是很有意义的,很多场合下都会遇到类似需求,可以认为其值是定义的某种规则或者权重。
原理:将待排序Map中的所有元素置于一个列表中,接着使用Collections的一个静态方法 sort(List list, Comparator< super T> c)
来排序列表,同样是用比较器定义比较规则。排序后的列表中的元素再依次装入Map,为了肯定的保证Map中元素与排序后的List中的元素的顺序一致,使用了LinkedHashMap数据类型。
实现代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public
class
MapSortDemo {
????``public
static
void
main(String[] args) {
????????``Map<String, String> map =
new
TreeMap<String, String>();
????????``map.put(``"KFC"``,
"kfc"``);
????????``map.put(``"WNBA"``,
"wnba"``);
????????``map.put(``"NBA"``,
"nba"``);
????????``map.put(``"CBA"``,
"cba"``);
????????``Map<String, String> resultMap = sortMapByKey(map);???
//按Key进行排序
//????? Map<String, String> resultMap = sortMapByValue(map); //按Value进行排序
????????``for
(Map.Entry<String, String> entry : resultMap.entrySet()) {
????????????``System.out.println(entry.getKey() +
" "
+ entry.getValue());
????????``}
????``}
????
????``/**
?????``* 使用 Map按value进行排序
?????``* @param map
?????``* @return
?????``*/
????``public
static
Map<String, String> sortMapByValue(Map<String, String> oriMap) {
????????``if
(oriMap ==
null
|| oriMap.isEmpty()) {
????????????``return
null``;
????????``}
????????``Map<String, String> sortedMap =
new
LinkedHashMap<String, String>();
????????``List<Map.Entry<String, String>> entryList =
new
ArrayList<Map.Entry<String, String>>(
????????????????``oriMap.entrySet());
????????``Collections.sort(entryList,
new
MapValueComparator());
????????``Iterator<Map.Entry<String, String>> iter = entryList.iterator();
????????``Map.Entry<String, String> tmpEntry =
null``;
????????``while
(iter.hasNext()) {
????????????``tmpEntry = iter.next();
????????????``sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());
????????``}
????????``return
sortedMap;
????``}
}
比较器类
1
2
3
4
5
6
7
8
class
MapValueComparator
implements
Comparator<Map.Entry<String, String>> {
????``@Override
????``public
int
compare(Entry<String, String> me1, Entry<String, String> me2) {
????????``return
me1.getValue().compareTo(me2.getValue());
????``}
}
例:
在一个仓库里,有一排条形码,其中第 i
个条形码为barcodes[i]
。
请你重新排列这些条形码,使其中两个相邻的条形码 不能 相等。 你可以返回任何满足该要求的答案,此题保证存在答案。
class Solution {
public int[] rearrangeBarcodes(int[] barcodes) {
int[] res=new int[barcodes.length];
int j=0;
Map<Integer,Integer> map=new LinkedHashMap<>();
for(int i=0;i<barcodes.length;i++){
map.putIfAbsent(barcodes[i],0);
map.put(barcodes[i],map.get(barcodes[i])+1);
}
ArrayList<Map.Entry<Integer,Integer>> list=new ArrayList<>(map.entrySet());
Collections.sort(list,new c());
Iterator itr=list.iterator();
Map.Entry<Integer, Integer> tmpEntry = null;
while(itr.hasNext()){
tmpEntry=(Map.Entry<Integer,Integer>)itr.next();
int num=tmpEntry.getValue();
int n=tmpEntry.getKey();
for(int i=0;i<num;i++){
res[j]=n;
j+=2;
if(j>=res.length){
j=1;
}
}
}
return res;
}
}
class c implements Comparator<Map.Entry<Integer,Integer>>{
public int compare(Map.Entry<Integer,Integer> m1,Map.Entry<Integer,Integer> m2){
return -(m1.getValue()-m2.getValue());
}
}