按键排序(sort by key)

jdk内置的Java.util包下的TreeMap<K,V>既可满足此类需求,原理很简单,其重载的构造器之一

有一个参数,该参数接受一个比较器,比较器定义比较规则,比较规则就是作用于TreeMap<K,V>的键,据此可实现按键排序。

/**
* TODO: 通过Map的key排序,由小到大排序
* @Auhor: RICK
* @Date : 2016年7月26日
*/
public static Map<String, String> sortMapByKey(Map<String, String> oriMap) {
if (oriMap == null || oriMap.isEmpty()) {
return null;
}
Map<String, String> sortedMap = new TreeMap<String, String>(new Comparator<String>() {
public int compare(String key1, String key2) {
int intKey1 = 0, intKey2 = 0;
try {
intKey1 = getInt(key1);
intKey2 = getInt(key2);
} catch (Exception e) {
intKey1 = 0;
intKey2 = 0;
}
return intKey1 - intKey2;
}});
sortedMap.putAll(oriMap);
return sortedMap;
} /**
* TODO: 把字符串转换成数字
* @Auhor: RICK
* @Date : 2016年7月26日
*/
private static int getInt(String str) {
int i = 0;
try {
Pattern p = Pattern.compile("^\\d+");
Matcher m = p.matcher(str);
if (m.find()) {
i = Integer.valueOf(m.group());
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
return i;
}

按值排序(sort by value)

按值排序就相对麻烦些了,貌似没有直接可用的数据结构能处理类似需求,需要我们自己转换一下。

Map本身按值排序是很有意义的,很多场合下都会遇到类似需求,可以认为其值是定义的某种规则或者权重。

/**
* TODO: 通过Map的Value排序,由小到大排序
* @Auhor: RICK
* @Date : 2016年7月26日
*/
public static Map<String, String> sortMapByValue(Map<String, String> oriMap) {
Map<String, String> sortedMap = new LinkedHashMap<String, String>();
if (oriMap != null && !oriMap.isEmpty()) {
List<Map.Entry<String, String>> entryList = new ArrayList<Map.Entry<String, String>>(oriMap.entrySet());
Collections.sort(entryList,
new Comparator<Map.Entry<String, String>>() {
public int compare(Entry<String, String> entry1,
Entry<String, String> entry2) {
int value1 = 0, value2 = 0;
try {
value1 = getInt(entry1.getValue());
value2 = getInt(entry2.getValue());
} catch (NumberFormatException e) {
value1 = 0;
value2 = 0;
}
return value1 - value2;
}
});
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;
} /**
* TODO: 把字符串转换成数字
* @Auhor: RICK
* @Date : 2016年7月26日
*/
private static int getInt(String str) {
int i = 0;
try {
Pattern p = Pattern.compile("^\\d+");
Matcher m = p.matcher(str);
if (m.find()) {
i = Integer.valueOf(m.group());
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
return i;
}

最新文章

  1. 十一个行为模式之迭代器模式(Iterator Pattern)
  2. Vue.js常用指令总结
  3. RegularHelper
  4. springmvc(1)DispatcherServlet源码简单解析
  5. python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容
  6. 如何:从代码创建 UML 类图(ZZ)
  7. php 模拟表单提交
  8. WPF自定义控件(一)——Button
  9. Part 48 to 51 Talking about Access Modifiers in C#
  10. [置顶] 最小生成树Prim算法
  11. linux apache模块的安装
  12. android windows 上JNI编程
  13. shell脚本操作数据库
  14. Grunt插件之LiveReload 实现页面自动刷新,所见即所得编辑
  15. 关于jQuery表单下拉selected设置无效的解决方案
  16. (转)fiddler实现手机抓包的基础设置问题
  17. Spring Boot-JPA
  18. docker 备注
  19. 分布式一致性算法2PC和3PC
  20. python数据结构与算法第三天【时间复杂度计算方法】

热门文章

  1. 转在Python中实现PageFactory模式
  2. Inno Setup 打包的文件以管理员权限执行
  3. linux 批量替换内容
  4. lua的时间和日期函数
  5. MySQL分组查询获取每个学生前n条分数记录(分组查询前n条记录)
  6. JS继承的6种方法
  7. 本地测试Tomcat配置Https访问
  8. CCNA2.0笔记_WAN技术-帧中继
  9. php的颜色定义表
  10. linux学习笔记13--命令head和tail