HashMap和TreeMap

对于HashMap和TreeMap的区别一直存在于理论层次:
HashMap是一个无序的键值对集合,他是通过hashCode对其内容进行快速的查找,而TreeMap则是一个有序的键值对集合.我们在程序开发中经常用HashMap来实现数据的存储,最近我终于碰到了一个用TreeMap来解决问题的处理方式了,下面和大家分享一下.

hashMap存放的值去的时候和存值的顺序不一致,LinkedHashMap存放的值去取的时候和存值的顺序一致。TreeMap可以根据key或者value进行排序.

需求描述:"root"为某一书籍的关键字,有很多以root为关键字的书籍在不同年份被发表,我们想要做一个“年份——发表量”的统计图,通过从solr里获取信息,由于刚开始使用solr,设置solr排序没成功,如果solr或者数据库方面没有做排序的话,获取的统计信息很可能是乱序的,为了使统计信息按照年份升序排列,在中间逻辑处理中,我用new TreeMap()来代替new HashMap(),这样在TreeMap中会自动将数据信息按照年份升序排列.


以下是TreeMap的两种排序方式:
1、根据key进行排序
Map<String,String> preMap = new TreeMap<String, String>(new Comparator<String>(){
@Override
public int compare(Object o1, Object o2) {
Integer a1 = Integer.parseInt((String) o1);
Integer a2 = Integer.parseInt((String) o2);
return a1.compareTo(a2);
}
});

2、根据value进行排序,这个排序的方式对应的数据格式为Map<String,Integer>或者<String,"1">这样的格式:
package com.gather.web.gather.bus.tools;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.TreeMap;

public class TreeMapSortByValue implements Comparator<String>{

TreeMap<String, String> base_map;

public TreeMapSortByValue(TreeMap<String, String> base_map){
this.base_map = base_map;
}

@Override
public int compare(String arg0, String arg1) {
if (!base_map.containsKey(arg0) || !base_map.containsKey(arg1)) {
return 0;
}

Integer v0 = 0;
Integer v1 = 0;
if(null != base_map.get(arg0)){
v0 = Integer.parseInt(base_map.get(arg0));
}
if(null != base_map.get(arg1)){
v1 = Integer.parseInt(base_map.get(arg1));
}

if(v0 < v1){
return 1;
}else if (v0 == v1) {
return 0;
}else {
return -1;
}
}

public static void main(String[] args) {
TreeMap<String,String> newMap=new TreeMap<String,String>();
newMap.put("dsaf1", "1");
newMap.put("dsaf9", "9");
newMap.put("dsaf4", "14");
newMap.put("dsaf7", "7");
newMap.put("dsaf6", "6");
newMap.put("dsaf3", "3");
newMap.put("dsaf10", "10");

TreeMapSortByValue bvc =new TreeMapSortByValue(newMap);
List<String> newList=new ArrayList<String>(newMap.keySet());
Collections.sort(newList, bvc);
for(String str:newList){
System.out.println(str+"================================="+newMap.get(str));
}
}
}

结果为:
dsaf4==============14
dsaf10==============10
dsaf9==============9
dsaf7==============7
dsaf6==============6
dsaf3==============3
dsaf1==============1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值