map集合排序
程序员文章站
2024-02-15 17:23:58
...
写东西时遇到一个问题,要将HashMap按照value的值来进行排序。
百度了一下,膜拜了一下大佬的博客 map集合排序
但是感觉有些繁琐,因为比较菜,对Comparator比较器不熟悉,就自己想了一种易于理解办法。
场景是这样的,一个Map中,泛型为<String,Double>,现在要按照value从大到小对这个集合排序,而且value值可能有相同的,所以
没办法将它反着放进另外一个Map中,因为Map中key不能相同。
思路是:
建立一个二维数组,行数为2,列数为value的个数,即map.size()。遍历集合,将每一个value依次放入第一行,将每一个key依次放入第二行与之对应。这样就形成了一种对应关系,然后对第一行中的value进行排序,当要移动value时,把与之对应的key也跟着移动即可。
代码:
@org.junit.Test
public void test() throws IOException{
Map<String,Double> map=new LinkedHashMap<String,Double>();
map.put("101", 1.1);
map.put("103", 0.1);
map.put("104", 2.1);
map.put("105", 4.1);
map.put("102", 3.1);
Double sort[][]=new Double[2][map.size()];
int n=0;
for(Entry<String,Double> e:map.entrySet()){//将value、key依次对应存入数组
sort[0][n]=e.getValue();
sort[1][n++]=Double.valueOf(e.getKey());
}
for(int i=0;i<map.size()-1;i++){//这里采用冒泡排序 复杂度取决于你用的排序方法
for(int j=i+1;j<map.size();j++){
if(sort[0][i]<sort[0][j]){
double t;
//交换value
t=sort[0][i];
sort[0][i]=sort[0][j];
sort[0][j]=t;
//交换key
t=sort[1][i];
sort[1][i]=sort[1][j];
sort[1][j]=t;
}
}
}
//也可以将结果再存入集合们这里直接输出
System.out.println("排序后:");
for(int i=0;i<2;i++){
for(int j=0;j<map.size();j++){
if(i!=1){
System.out.print(sort[i][j]+"\t");
}else{
System.out.print(String.valueOf(sort[i][j])+"\t");
}
}
System.out.println();
}
}
结果: