java关键字map_[Java] 将Map按Key(主键/关键字)或Value(值)排序

在书写程序的过程中,常常需要对map的key或者value进行排序,Java本身没有提供对map排序的方法,下面的代码展示如何手动对map进行排序

1、按Key排序

jdk内置的java.util包的TreeMap可以实现对Key的排序,通过构造方法中传入比较器Comparator即可实现,这里Comparator类型输入的泛型参数是K的超类或本身,即TreeMap(Comparator super K> comparator)

相关代码

public class MapSortDemo {

public static void main(String[] args) {

Map map = new TreeMap();

map.put("KFC", "kfc");

map.put("WNBA", "wnba");

map.put("NBA", "nba");

map.put("CBA", "cba");

Map resultMap = sortMapByKey(map); //按Key进行排序

for (Map.Entry entry : resultMap.entrySet()) {

System.out.println(entry.getKey() + " " + entry.getValue());

}

}

/**

* 使用 Map按key进行排序

* @param map

* @return

*/

public static Map sortMapByKey(Map map) {

if (map == null || map.isEmpty()) {

return null;

}

Map sortMap = new TreeMap(

new MapKeyComparator());

sortMap.putAll(map);

return sortMap;

}

}

比较器类

class MapKeyComparator implements Comparator{

@Override

public int compare(String str1, String str2) {

return str1.compareTo(str2);

}

}

2、按Value排序

在很多场景下,需要对value排序,Java无法直接实现对map的value的排序,因此需要借助其他数据结构来进行排序。这里使用Collections的sort方法,将map转化为list结构,对list进行排序,之后在把list中数据装回map,达到排序目的。在装回map过程中,使用LinkedHashMap保证装回的顺序与list一致。

例如,我们需要对一些多个圆形轨道上物体的位置进行排序,每个物体都有一个位置属性,位置包含所处的轨道和物体的初始角度,现在要求只按照初始角度进行从小到大的排序。

代码如下

/**

* poisiton是一个map,保存每个物体对应的位置

*/

Map sortedMap = new LinkedHashMap();

List> entryList = new ArrayList>(position.entrySet()); //先转为entrySet,在转为List

Collections.sort(entryList, new MapValueComparator());

Iterator> iter = entryList.iterator();

Map.Entry tmpEntry = null;

while (iter.hasNext()) {

tmpEntry = iter.next();

sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue()); //add sorted object in map

}

/**

* 比较器类

* 根据轨道物体对象的初始角度对position映射进行升序排序

*

* @param 轨道物体类型

*/

class MapValueComparator implements Comparator> {

@Override

public int compare(Entry o1, Entry o2) {

double a1 = o1.getValue().getAngle();

double a2 = o2.getValue().getAngle();

/*

* compare函数返回的数值正负遵循规则:

* compare(a,b)

* 一切以升序排列,如果 a 与 b 比较返回正数,说明a应该排在b后面,即a比b大

* 如果 a b比较返回负数,说明a小于b,a排在b前面

*/

if(a1 > a2) return 1; //a1角度大于a2,返回正数

else if(a1 < a2) return -1;

if(Math.abs(a1 - a2) < 1e-10) return 0;

return 0;

}

}

这里的代码说明如果value是一个类,那么可以针对类中某一个具体属性进行排序,也可综合考虑多个属性进行排序。

参考文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值