大家好,又见面了,我是你们的朋友全栈君。
Map排序的方式有很多种,这里记录下自己总结的两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value)。
1、按键排序
jdk内置的java.util包下的TreeMap
实现代码
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
map.put("KFC", "kfc");
map.put("WNBA", "wnba");
map.put("NBA", "nba");
map.put("CBA", "cba");
Map
for (Map.Entry
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
/**
* 使用 Map按key进行排序
* @param map
* @return
*/
public static Map
if (map == null || map.isEmpty()) {
return null;
}
Map
new MapKeyComparator());
sortMap.putAll(map);
return sortMap;
}
}
比较器类
1
2
3
4
5
6
7
8
class MapKeyComparator implements Comparator
@Override
public int compare(String str1, String str2) {
return str1.compareTo(str2);
}
}
2、按值排序
按值排序就相对麻烦些了,貌似没有直接可用的数据结构能处理类似需求,需要我们自己转换一下。
Map本身按值排序是很有意义的,很多场合下都会遇到类似需求,可以认为其值是定义的某种规则或者权重。
原理:将待排序Map中的所有元素置于一个列表中,接着使用Collections的一个静态方法 sort(List
来排序列表,同样是用比较器定义比较规则。排序后的列表中的元素再依次装入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
map.put("KFC", "kfc");
map.put("WNBA", "wnba");
map.put("NBA", "nba");
map.put("CBA", "cba");
Map
// Map
for (Map.Entry
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
/**
* 使用 Map按value进行排序
* @param map
* @return
*/
public static Map
if (oriMap == null || oriMap.isEmpty()) {
return null;
}
Map
List
oriMap.entrySet());
Collections.sort(entryList, new MapValueComparator());
Iterator
Map.Entry
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
@Override
public int compare(Entry
return me1.getValue().compareTo(me2.getValue());
}
}
例:
在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。
请你重新排列这些条形码,使其中两个相邻的条形码 不能 相等。 你可以返回任何满足该要求的答案,此题保证存在答案。
代码语言:javascript复制class Solution {
public int[] rearrangeBarcodes(int[] barcodes) {
int[] res=new int[barcodes.length];
int j=0;
Map
for(int i=0;i map.putIfAbsent(barcodes[i],0); map.put(barcodes[i],map.get(barcodes[i])+1); } ArrayList Collections.sort(list,new c()); Iterator itr=list.iterator(); Map.Entry while(itr.hasNext()){ tmpEntry=(Map.Entry int num=tmpEntry.getValue(); int n=tmpEntry.getKey(); for(int i=0;i res[j]=n; j+=2; if(j>=res.length){ j=1; } } } return res; } } class c implements Comparator public int compare(Map.Entry return -(m1.getValue()-m2.getValue()); } }发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159777.html原文链接:https://javaforall.cn