A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈承 黑马帝   /  2011-7-28 19:50  /  2733 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

前几天回答一个马友的问题就遇到了这样的一个问题。看代码:[code=java]                String str = "aaaaabbbccccddddddddeeeee";
                // key保存字符,value保存出现的次数
                Map<String, Integer> map = new HashMap<String, Integer>();
                for (int i = 0; i <= str.length() - 1; i++) {
                        String subVal = str.substring(i, 1 + i);
                        boolean flag = false; // 标示一个字符是否处理过。
                        for (String key : map.keySet()) {
                                // 如果有相同的字符 value + 1 否则把字符存入map
                                if (key.equals(subVal)) {
                                        map.put(key, map.get(key) + 1);
                                        flag = true; // 字符标示为处理过
                                }
                        }
                        // 如果字符没有处理过就在这里处理
                        if (!flag) {
                                map.put(subVal, 1);
                        }
                }[/code]上面的代码得到了一个map集合,我希望通过这一个map的value排序输出,结果像这样[code=java]b出现了:3次
c出现了:4次
e出现了:5次
a出现了:5次
d出现了:8次[/code]请各位马友各显神通,看看如何实现最简单,效率最高。。。
当然也可以改写生成map的方法使他遍历出来就是一个有序的,但是一定是map。。

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 今晚加分不解释。

查看全部评分

3 个回复

正序浏览
黑马网友  发表于 2011-7-29 13:41:34
板凳
好办法,学到了。
之前我竟然这样写:[code=java]                String str = "aaaaabbbccccddddddddeeeee";
                // key保存字符,value保存出现的次数
                Map<String, Integer> map = new HashMap<String, Integer>();
                for (int i = 0; i <= str.length() - 1; i++) {
                        String subVal = str.substring(i, 1 + i);
                        boolean flag = false; // 标示一个字符是否处理过。
                        for (String key : map.keySet()) {
                                // 如果有相同的字符 value + 1 否则把字符存入map
                                if (key.equals(subVal)) {
                                        map.put(key, map.get(key) + 1);
                                        flag = true; // 字符标示为处理过
                                }
                        }
                        // 如果字符没有处理过就在这里处理
                        if (!flag) {
                                map.put(subVal, 1);
                        }
                }
                Object[] strArray =  map.keySet().toArray();
                Object temp = null;
                for (int i = 0; i < strArray.length; i++) {
                        for (int j = 1 + i; j < strArray.length; j++) {
                                if (map.get(strArray[i]) < map.get(strArray[j])) {
                                        temp = strArray[i];
                                        strArray[i] = strArray[j];
                                        strArray[j] = temp;       
                                }
                        }
                }
                for (Object object : strArray) {
                        System.out.println(object + "出现的次数:"+ map.get(object));
                }[/code]
回复 使用道具 举报
黑马网友  发表于 2011-7-28 23:21:21
藤椅
根据LS的提示成功实现,受教了代码如下:[code]package com.itcast.bank;

import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Test2 {

        /**
         * @param args
         */
        public static void main(String[] args) throws Exception {
                String str = "aaaaabbbccccddddddddeeeee";
                // key保存字符,value保存出现的次数
                Map<String, Integer> map = new HashMap<String, Integer>();
                for (int i = 0; i <= str.length() - 1; i++) {
                        String subVal = str.substring(i, 1 + i);
                        boolean flag = false; // 标示一个字符是否处理过。
                        for (String key : map.keySet()) {
                                // 如果有相同的字符 value + 1 否则把字符存入map
                                if (key.equals(subVal)) {
                                        map.put(key, map.get(key) + 1);
                                        flag = true; // 字符标示为处理过
                                }
                        }
                        // 如果字符没有处理过就在这里处理
                        if (!flag) {
                                map.put(subVal, 1);
                        }
                }
               
                Map.Entry[] entries = getSortedHashtableByValue(map);
                for (int i=0; i<entries.length; i++){
                        System.out.println(entries[i]);
                }
               

        }
       
        public static Map.Entry[] getSortedHashtableByValue(Map map) {
                Set set = map.entrySet();
                Map.Entry[] entries = (Map.Entry[])set.toArray(new Map.Entry[set.size()]);
               
                Arrays.sort(entries, new Comparator(){
                        public int compare(Object arg0, Object arg1){
                                Long key1 = Long.valueOf(((Map.Entry) arg0).getValue().toString());   
                                Long key2 = Long.valueOf(((Map.Entry) arg1).getValue().toString());
                                return key1.compareTo(key2);   
                        }
                       
                });
               
               
                return entries;
        }
}[/code]

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 新手报到,要加分。

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-28 21:21:40
沙发
[code=java]public static Map.Entry[] getSortedHashtableByValue(Map<?, ?> map) {  
               Set<?> set = map.entrySet();  
               Map.Entry[] entries = set.toArray(new Map.Entry[set.size()]);  
               Arrays.sort(entries, new Comparator<Object>() {  
                   public int compare(Object arg0, Object arg1) {  
                       Long key1 = Long.valueOf(((Map.Entry) arg0).getValue().toString());  
                       Long key2 = Long.valueOf(((Map.Entry) arg1).getValue().toString());  
                       return key1.compareTo(key2);  
                   }  
               });  
               return entries;  
        } [/code]此方法可对map中元素按值排序,并返回一个排完序的entry数组,详细,请自行完成

评分

参与人数 1技术分 +10 收起 理由
老罗 + 10 今晚加分不解释。惊喜!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马