Java中map根据值进行排序

一次电面经验让我重新学习map集合。首先先查看API文档, public interface Map<K,V>,将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口。某些映射实现可明确保证其顺序,如 TreeMap 类;另一些映射实现则不保证顺序,如 HashMap 类。 虽然可以用TreeMap保证排序,但是在HashMap中自己实现根据值的排序也是一种学习。所以找来了如下代码:

public class TestMap {
public static void main(String[] args) {  
Map<String, Integer> map = new HashMap<String, Integer>();  
  
map.put("lisi", 5);   
map.put("lisi1", 1);   
map.put("lisi2", 3);   
map.put("lisi3", 9);   
  
List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>(  
        map.entrySet());  
System.out.println("--------------排序前--------------");  
for (int i = 0; i < infoIds.size(); i++) {  
    String id = infoIds.get(i).toString();  
    System.out.println(id);  
}  
// 排序  
Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() {  
    public int compare(Map.Entry<String, Integer> o1,  
            Map.Entry<String, Integer> o2) {  
        return ( o1.getValue()-o2.getValue());  
    }  
});  
System.out.println("--------------排序后--------------");  
for (int i = 0; i < infoIds.size(); i++) {  
    Entry<String,Integer> ent=infoIds.get(i);  
    System.out.println(ent.getKey()+"="+ent.getValue());  
}       
}

}

之后又发现api文档中存在一个map.entry<K,V>接口,Map.entrySet 方法返回映射的 collection 视图,其中的元素属于此类。获得映射项引用的唯一 方法是通过此 collection 视图的迭代器来实现。这些 Map.Entry 对象 在迭代期间有效;更确切地讲,如果在迭代器返回项之后修改了底层映射,则某些映射项的行为是不确定的,除了通过 setValue 在映射项上执行操作之外。 为此查找了一些有用的资料,http://q.cnblogs.com/q/66942/Map是个key:value对的集合,是散列表类。里面包含key value两个部分,如果要访问它的内部,这时候就需要一个更直接的部分,来方便访问,就有了-->Map.Entry。就像一个装着两样东西的袋子,给它一根拉开的拉链?map能通过key能找到对应的value;map.entry是map内的key-value对。

学习到的技术点:

1.map的排序问题,代码如上

2.在字符串里找出出现次数最多的字母和出现的次数:

public class MostString {
public static void main(String[] args) {
String s ="adadfdfseffserfefsefsseetsdg";

Map map = new HashMap();
for(int i=0; i< s.length();i++){
String tmpStr = s.charAt(i)+"";
Object tmpObj = map.get(tmpStr);
if(tmpObj == null){
map.put(tmpStr, new Integer(1));
}else {
map.put(tmpStr, new Integer(((Integer) tmpObj).intValue()+1));
}
}

for(Iterator itor =map.keySet().iterator();itor.hasNext();){
String word = itor.next().toString();
Integer integer =(Integer) map.get(word);
System.out.println("字母["+word+"]出现次数:"+integer.intValue());
}
List<Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>(  
        map.entrySet());  
System.out.println("--------------排序后--------------");  
infoIds = sort(map);
for (int i = 0; i < infoIds.size(); i++) {  
    Entry<String,Integer> ent=infoIds.get(i);  
    String word = ent.getKey();
    Integer integer = ent.getValue();
    System.out.println("字母["+word+"]出现次数:"+integer.intValue());  
}    


}
public static List<Entry<String, Integer>> sort(Map<String, Integer> map) {
List<Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>(  
        map.entrySet());  
// 排序  
Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() {  
    public int compare(Map.Entry<String, Integer> o1,  
            Map.Entry<String, Integer> o2) {  
        return ( o1.getValue()-o2.getValue());  
    }  
});  
return infoIds;
}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值