大家好,又见面了,我是你们的朋友全栈君。
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 |
|
比较器类
1 2 3 4 5 6 7 8 |
|
2、按值排序
按值排序就相对麻烦些了,貌似没有直接可用的数据结构能处理类似需求,需要我们自己转换一下。
Map本身按值排序是很有意义的,很多场合下都会遇到类似需求,可以认为其值是定义的某种规则或者权重。
原理:将待排序Map中的所有元素置于一个列表中,接着使用Collections的一个静态方法 sort(List<T> 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 |
|
比较器类
1 2 3 4 5 6 7 8 |
|
例:
在一个仓库里,有一排条形码,其中第 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());
}
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159777.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...