黑马程序员技术交流社区

标题: TreeMap 按照value排序 求解决办法 [打印本页]

作者: 黄锦成    时间: 2013-1-21 16:44
标题: TreeMap 按照value排序 求解决办法
  1. /**
  2. * 统计字符串”abadcdffbaeba”中每个字符出现了多少次,按次数排序并输出。
  3. 例如:c : 1,e : 1,d : 2,f : 2,b : 3,a : 4
  4. * @author Administrator
  5. * 在TreeMap中,是根据 Key来排序的,现在我想根据value来排序。
  6. 所以我把TreeMap中的键值对映射关系存入到List中,List中的元素类型是Map.Entry<Character, Integer>
  7. 然后根据Collections类中的sort方法来排序。自己要定义一个比较器来定义比较规则

  8. */
  9. public class Test {
  10. public static void main(String[] args) {
  11.       count("abadcdffbaeba");
  12. }

  13. private static void count(String string) {
  14. Map<Character, Integer> map = new TreeMap<Character, Integer>();
  15. char[] chars = string.toCharArray();
  16. for(char ch : chars){
  17. if(map.containsKey(ch)){
  18. int oldValue = map.get(ch);
  19. int newValue = oldValue+1;
  20. map.put(ch, newValue);
  21. }else{
  22. map.put(ch, 1);
  23. }
  24. }
  25. System.out.println("排序前:"+map);

  26. //开始排序
  27. //将map中的每个映射关系Entry存入List<Map.Entry<Character, Integer>>中
  28. List<Map.Entry<Character, Integer>> list = new ArrayList<Map.Entry<Character, Integer>>();
  29. Set<Map.Entry<Character, Integer>> entrySet = map.entrySet();
  30. for(Map.Entry<Character, Integer> entry : entrySet){
  31. list.add(entry);
  32. }
  33. //根据Collections工具类的sort方法来对List中的元素进行排序
  34. Collections.sort(list,new MyComparator());
  35. //打印排序后的集合
  36. System.out.println("排序后:");
  37. for (int i = 0; i < list.size(); i++) {
  38. if(i>0)
  39. System.out.print(" , ");
  40. System.out.print(list.get(i).getKey()+" : "+list.get(i).getValue());
  41. }
  42. }
  43. }
  44. /**
  45. * 自定义比较器
  46. * @author Administrator
  47. *
  48. */
  49. class MyComparator implements Comparator<Map.Entry<Character,Integer>>{
  50. public int compare(Entry<Character, Integer> o1,Entry<Character, Integer> o2) {
  51. return o1.getValue()-o2.getValue();
  52. }
  53. }
复制代码
          不知道有没有其他的方式对TreeMap进行排序。是按照value来排序的,按照key排序的就不用了

         我这个排序方法严格来说还不行。照理说应该在map里面的元素已经按照value的顺序存放的,但是我写的代码里,只是相当于复制了一份map,然后通过List集合操作排序。原先的map顺序还是没变的
作者: 王少雷    时间: 2013-1-21 17:11
本帖最后由 王少雷 于 2013-1-21 17:23 编辑

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

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

        }

        /**
         * @description 对HashMap按值进行排序
         *
         * */
        static class MyComparator  implements Comparator<String> {

                TreeMap<String, Integer> base_map;

                public MyComparator (TreeMap<String, Integer> base_map) {

                        this.base_map = base_map;

                }

                public int compare(String arg0, String arg1) {

                        if (!base_map.containsKey(arg0) || !base_map.containsKey(arg1)) {

                                return 0;

                        }

                        if (base_map.get(arg0) < base_map.get(arg1)) {

                                return 1;

                        } else if (base_map.get(arg0) == base_map.get(arg1)) {

                                return 0;

                        } else {

                                return -1;

                        }

                }

        }

}

作者: 黄锦成    时间: 2013-1-21 19:08
王少雷 发表于 2013-1-21 17:11
public class TreeMapTest {
        public static void main(String[] args) {
                TreeMap newMap = new TreeMap( ...

你这个跟我写的思路差不多。我想要的是能不能像TreeSet那样排序。即排序后,TreeMap里的元素是按照value排序的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2