TreeMap 排序

一、TreeMap

TreeMap 默认排序规则:按照key的字典顺序来排序(升序)

当然,也可以自定义排序规则:要实现Comparator接口。

用法简单,先看下下面的demo

public class SortDemo {

    public static void main(String[] args) {
        System.out.println("---------------- 默认 排序结果-----------------");
        createDefaultSortTreeMap();
        System.out.println("---------------- 自定义 排序结果-----------------");
        createDefinitionSortTreeMap();
    }

    public static void createDefaultSortTreeMap() {
        TreeMap<String, String> map = new TreeMap<String, String>();

        init(map);
        print(map);
    }

    public static void createDefinitionSortTreeMap() {

        TreeMap<String, String> map = new TreeMap<String, String>(new Comparator<String>() {

            @Override
            public int compare(String o1, String o2) {
                    return o2.compareTo(o1);
            }

        });

        init(map);
        print(map);
    }

    public static void init(Map<String, String> map) {
        map.put("c", "1");
        map.put("a", "1");
        map.put("bb", "1");
        map.put("b", "1");
    }

    public static void print(Map<String, String> map) {
        Iterator<Entry<String, String>> it = map.entrySet().iterator();
        while(it.hasNext()) {
            Entry<String, String> entry = it.next();
            System.out.println(entry.getKey() + " : " + entry.getValue());
        }
    }

结果:
---------------- 默认 排序结果-----------------
a : 1
b : 1
bb : 1
c : 1
---------------- 自定义 排序结果-----------------
c : 1
bb : 1
b : 1
a : 1

二、扩展:字典顺序

1、排序规则

两个字符串 s1, s2比较

(1)、如果s1和s2是父子串关系,则 子串 < 父串

(2)、如果非为父子串关系, 则从第一个非相同字符来比较。

     例子 s1 = "ab", s2 = "ac"    这种情况算法规则是从第二个字符开始比较,由于‘b‘ < ‘c‘ 所以  "ab" < "ac"

(3)、字符间的比较,是按照字符的字节码(ascii)来比较

2、  compareTo 实现机制:对于字符串来说,字典排序规则;对于数字来说,直接按照大小排序

下面, 是我在项目中,遇到的一个坑,也不能算坑吧,只能说基础掌握得不扎实,导致老不断犯错。先说下场景,有个需求要对Map排序,当时想当然就用了自定义的TreeMap(new

Comparator )

key 为 String, value 也会String类型, 然后很不幸的是,我的Key 是 数字 字符串 ,如 Map.put("2","1"),Map.put("12","1"),Map.put("13","1")

正常思维排序结果是 "2" < "12" < "13" ,仔细一想,compareTo 底层算法是 "字典排序",正确的排序结果 : "12" < "13" <  "2"

但是我的需求又是想要"2" < "12" < "13"这种效果,如何实现呢?很简单,把Key改为Long类型,这样,就会按照大小来排序。

看下下面的例子,可能比较简单明了!

  1 public class SortDemo2 {
  2
  3     private final static int SIZE = 30;
  4
  5     public static void main(String[] args) {
  6         System.out.println("---------------- key 为 Sting 排序结果-----------------");
  7         String s = new String();
  8         createTreeMap(s);
  9         System.out.println("---------------- key 为 Long 排序结果-----------------");
 10         Long l = new Long(0);
 11         createTreeMap(l);
 12     }
 13
 14     public static void createTreeMap(Object obj) {
 15
 16         TreeMap<Object, Object> map = new TreeMap<>(new Comparator<Object>() {
 17
 18             @Override
 19             public int compare(Object o1, Object o2) {
 20                 if(o1 instanceof String && o2 instanceof String) {
 21                     return ((String) o1).compareTo((String) o2);
 22                 } else if(o1 instanceof Long && o2 instanceof Long) {
 23                     return ((Long) o1).compareTo((Long) o2);
 24                 }
 25                 return 0;
 26             }
 27
 28         });
 29
 30         for(int i = 1; i<SIZE; i++) {
 31             if(obj instanceof String) {
 32                 map.put(String.valueOf(i), String.valueOf(i));
 33             }
 34             if(obj instanceof Long) {
 35                 map.put(Long.valueOf(i), Long.valueOf(i));
 36             }
 37         }
 38
 39         print(map);
 40     }
 41
 42     public static void print(Map<Object, Object> map) {
 43         Iterator<Entry<Object, Object>> it = map.entrySet().iterator();
 44         while(it.hasNext()) {
 45             Entry<Object, Object> entry = it.next();
 46             System.out.println(entry.getKey() + " : " + entry.getValue());
 47         }
 48     }
 49 }
 50
 51 结果:
 52
 53 ---------------- key 为 Sting 排序结果-----------------
 54 1 : 1
 55 10 : 10
 56 11 : 11
 57 12 : 12
 58 13 : 13
 59 14 : 14
 60 15 : 15
 61 16 : 16
 62 17 : 17
 63 18 : 18
 64 19 : 19
 65 2 : 2
 66 20 : 20
 67 21 : 21
 68 22 : 22
 69 23 : 23
 70 24 : 24
 71 25 : 25
 72 26 : 26
 73 27 : 27
 74 28 : 28
 75 29 : 29
 76 3 : 3
 77 4 : 4
 78 5 : 5
 79 6 : 6
 80 7 : 7
 81 8 : 8
 82 9 : 9
 83 ---------------- key 为 Long 排序结果-----------------
 84 1 : 1
 85 2 : 2
 86 3 : 3
 87 4 : 4
 88 5 : 5
 89 6 : 6
 90 7 : 7
 91 8 : 8
 92 9 : 9
 93 10 : 10
 94 11 : 11
 95 12 : 12
 96 13 : 13
 97 14 : 14
 98 15 : 15
 99 16 : 16
100 17 : 17
101 18 : 18
102 19 : 19
103 20 : 20
104 21 : 21
105 22 : 22
106 23 : 23
107 24 : 24
108 25 : 25
109 26 : 26
110 27 : 27
111 28 : 28
112 29 : 29

时间: 2024-08-11 03:36:32

TreeMap 排序的相关文章

TreeSet与TreeMap排序

1.TreeSet原理: /* * TreeSet存储对象的时候, 可以排序, 但是需要指定排序的算法 *  * Integer能排序(有默认顺序), String能排序(有默认顺序), 自定义的类存储的时候出现异常(没有顺序) *  * 如果想把自定义类的对象存入TreeSet进行排序, 那么必须实现Comparable接口 *   在类上implement Comparable  *   重写compareTo()方法 *   在方法内定义比较算法, 根据大小关系, 返回正数负数或零 *  

TreeMap排序实例

现有一篇英文作文,让你从中找出出现频率最高的n个单词 As can be seen from the chart that money value of annual global electronic transactions id increasing gradually in the seven years. In 1997, the money value of global electronic commerce transactions is US$ 2.6 billion, whi

TreeMap排序

import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class MapSort {            public  TreeMap<String,Double> sort(HashMap<String,Double> map){         ValueComparator bvc =  new ValueC

【转】Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例

概要 这一章,我们对TreeMap进行学习.我们先对TreeMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeMap.内容包括:第1部分 TreeMap介绍第2部分 TreeMap数据结构第3部分 TreeMap源码解析(基于JDK1.6.0_45)第4部分 TreeMap遍历方式第5部分 TreeMap示例 转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3310928 第1部

Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例

概要 这一章,我们对TreeMap进行学习.我们先对TreeMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用TreeMap.内容包括:第1部分 TreeMap介绍第2部分 TreeMap数据结构第3部分 TreeMap源码解析(基于JDK1.6.0_45)第4部分 TreeMap遍历方式第5部分 TreeMap示例 转载:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3310928 第1部分 Tre

JAVA基础学习day16--集合三-Map、HashMap,TreeMap与常用API

一.Map简述 1.1.简述 public interface Map<K,V> 类型参数: K - 此映射所维护的键的类型 key V - 映射值的类型 value 该集合提供键--值的映射.key不能重复,一对对的存储方式 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. 1.2.方法 嵌套类摘要 static interface Map.Entry<K,V> 映射项(键-值对). 方法摘要 void clear() 从此映射中移除所有映射关系(可选操

Java Map集合利用比较器Comparator根据Key和Value的排序

TreeMap排序 根据Key进行排序 Map的根据key排序需要用到TreeMap对象,因为它是默认按照升序进行输出的,可以使用比较器compareTo对它进行降序排序,Comparator可以对集合对象或者数组进行排序的比较器接口,实现该接口的public compare(T o1,To2)方法即可实现排序,该方法主要是根据第一个参数o1,小于.等于或者大于o2分别返回负整数.0或者正整数,若是按照升序可以直接省略比较器代码Map<String, String> treeMap = new

TreeMap实现原理

摘要 研究项目底层代码时,发现项目中的数据的缓存用的是TreeMap来实现对数据的缓存管理.本片博文就TreeMap的源码.原理以及用法做一个探究 在用TreeMap之前我们要对TreeMap有个整体的认识. 1.TreeMap介绍 TreeMap是一个通过红黑树实现有序的key-value集合. TreeMap继承AbstractMap,也即实现了Map,它是一个Map集合 TreeMap实现了NavigableMap接口,它支持一系列的导航方法, TreeMap实现了Cloneable接口,

【java集合框架源码剖析系列】java源码剖析之TreeMap

注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本.本博客将从源码角度带领大家学习关于ArrayList的知识. 一TreeMap的定义: public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.Serializable 可以看到TreeMap是继承自AbstractMap同时实现了NavigableMap,