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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁梦希 金牌黑马   /  2013-4-12 22:56  /  1640 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 袁梦希 于 2013-4-13 03:27 编辑

  1. TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();

  2. tm.put('a', 1);
  3. tm.put('c', 3);
  4. tm.put('y', 6);
  5. tm.put('f', 3);

  6. System.out.println(tm);
复制代码
如果我想按比较器的顺序进行对value值进行排序怎样排。(值为主要条件,键为次要条件)
键值对必须对应输出  如     {a=1,f=2,y=3,c=4}

TreeMap集合可以传比较器,帮助文档为:



如果比较器不能排序,那么怎样用其他方法排序!我想要代码实现,不要文字叙述,先谢过大家!

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

8 个回复

倒序浏览
本帖最后由 。。。。。。 于 2013-4-12 23:27 编辑

重新定义的比较器,已经只能比较键值,不会比较Value。

G~V~M5201O01F[VR6B]3%I6.jpg (71.75 KB, 下载次数: 16)

G~V~M5201O01F[VR6B]3%I6.jpg
回复 使用道具 举报
。。。。。。 发表于 2013-4-12 23:26
重新定义的比较器,已经只能比较键值,不会比较Value。

如果我就想实现排序,怎样才可以排啊,这个文档比较深奥。
回复 使用道具 举报
TreeMap只可以用于给键进行排序,你想实现给值排序的话,,可以用HashMap。。
在把他放进Set集合中,迭代取出来的时候,把字符'a'转化为hashCode码,进行比较
打印出来的时候在转化成字符,,ok了。。
实现比较复杂,我马上睡了,,你先试下,不行我明天帮你弄下

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;


public class T {

        public static void main(String[] args) {
                TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();

                tm.put('a', 1);
                tm.put('c', 3);
                tm.put('y', 6);
                tm.put('f', 2);

                System.out.println(sort(tm));
        }
        
        /** TreeMap的顺序是自然顺序(如整数从小到大),也可以指定比较函数。但不是插入的顺序
         *  返回LinkedHashMap,以支持插入的顺序 */
        private static LinkedHashMap<Character,Integer> sort(TreeMap<Character,Integer> map) {
                List<Map.Entry<Character,Integer>> list = new ArrayList<Map.Entry<Character,Integer>>();
                Iterator<Map.Entry<Character,Integer>> iter = map.entrySet().iterator();
                while(iter.hasNext()) {
                        Map.Entry<Character,Integer> entry = iter.next();
                        list.add(entry);
                }
                Collections.sort(list, new Comparator<Object>() {
                        @SuppressWarnings("unchecked")
                        @Override
                        public int compare(Object o1, Object o2) {
                                Map.Entry<Character,Integer> entry1 = (Map.Entry<Character,Integer>)o1;
                                Map.Entry<Character,Integer> entry2 = (Map.Entry<Character,Integer>)o2;
                                return entry1.getValue() - entry2.getValue();
                        }
                });
                LinkedHashMap<Character,Integer> sortedMap = new LinkedHashMap<Character,Integer>();
                for(Map.Entry<Character,Integer> entry : list) {
                        sortedMap.put(entry.getKey(), entry.getValue());
                }
               
                return sortedMap;
        }
}

有不明白的站短我

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 牛海亮 于 2013-4-13 02:03 编辑

TreeMap的底层数据结构是二叉树,在向二叉树内存数据时,它只会按照键值Key进行比较,这都是编译环境预先定义好的。它的Comparator对象的泛型类型只能是键值的类型。Compartor对象的compare方法中参数的类型会始终和Compartor对象的泛型类型保持一致,所以,“按比较器的顺序进行对value值进行排序”是无法实现的。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
“向二叉树内存数据时,它只会按照键值Key进行比较 ”这都是编译环境预先定义好的。
回复 使用道具 举报
郭强 发表于 2013-4-13 00:07
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

奥  原来还用到了工具类Collections中的sort()方法,也知道了回顾了LinkedHashMap.谢了哥们
回复 使用道具 举报
郭强 中级黑马 2013-4-13 07:54:24
9#
不客气呵呵
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马