黑马程序员技术交流社区

标题: 【排序】TreeMap集合 急! [打印本页]

作者: 袁梦希    时间: 2013-4-12 22:56
标题: 【排序】TreeMap集合 急!
本帖最后由 袁梦希 于 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集合可以传比较器,帮助文档为:



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


作者: 。。。。。。    时间: 2013-4-12 23:26
本帖最后由 。。。。。。 于 2013-4-12 23:27 编辑

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

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

G~V~M5201O01F[VR6B]3%I6.jpg

作者: 袁梦希    时间: 2013-4-12 23:32
。。。。。。 发表于 2013-4-12 23:26
重新定义的比较器,已经只能比较键值,不会比较Value。

如果我就想实现排序,怎样才可以排啊,这个文档比较深奥。
作者: CrazyProgram    时间: 2013-4-13 00:04
TreeMap只可以用于给键进行排序,你想实现给值排序的话,,可以用HashMap。。
在把他放进Set集合中,迭代取出来的时候,把字符'a'转化为hashCode码,进行比较
打印出来的时候在转化成字符,,ok了。。
实现比较复杂,我马上睡了,,你先试下,不行我明天帮你弄下
作者: 郭强    时间: 2013-4-13 00:07
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;
        }
}

有不明白的站短我

作者: 牛海亮    时间: 2013-4-13 01:57
本帖最后由 牛海亮 于 2013-4-13 02:03 编辑

TreeMap的底层数据结构是二叉树,在向二叉树内存数据时,它只会按照键值Key进行比较,这都是编译环境预先定义好的。它的Comparator对象的泛型类型只能是键值的类型。Compartor对象的compare方法中参数的类型会始终和Compartor对象的泛型类型保持一致,所以,“按比较器的顺序进行对value值进行排序”是无法实现的。
作者: 牛海亮    时间: 2013-4-13 01:59
“向二叉树内存数据时,它只会按照键值Key进行比较 ”这都是编译环境预先定义好的。
作者: 袁梦希    时间: 2013-4-13 03:26
郭强 发表于 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
不客气呵呵




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