java第八章集合中TreeMap的用法

来源:互联网 发布:柏林 知乎 编辑:程序博客网 时间:2024/04/28 06:49

java中的TreeMap方法是红黑树结构,每一个key-value节点作为红黑树的一个节点,TreeMap存储是会进行排序的,会根据key来对key-value键值对进行排序,其中排序方式也是分为两种,一种是自然排序,一种是定制排序

自然排序:TreeMap中所有的key必须实现Comparable接口,并且所有的key都应该是同一个类的对象,否则会报ClassCastException异常

定制排序:定义TreeMap时,创建一个comparator对象,该对象对所有的treeMap中所有的key值进行排序,采用定制排序的时候不需要TreeMap中所有的key必须实现Comparable接口

TreeMap判断两个元素相等的标准:两个key通过compareTo()方法返回0,则认为这两个key相等

如果使用自定义的类来作为TreeMap中的key值,且想让TreeMap能够良好的工作,则必须重写自定义类中的equals()方法,TreeMap中判断相等的标准是:两个key通过equals()方法返回为true,并且通过compareTo()方法比较应该返回为0:

TreeMap对应的类图结构

TreeMap中提供了一序列根据key顺序访问key-value的方法

~Map.Entry  firstEntry();返回该map中最小的key对应的key-value,若map为空,则返回为null;

~Object firstKey();返回该Map中最小的key值,若map为空,则返回null;

~Map.Entry  lastEntry();返回map中最大的key对应的key-value,若map为空,则返回为null;

~Object  lastKey();返回该Map中最大的key值,若map为空,则返回null;

~Map.Entry higerEntry(Object key);返回该map中大于指定key的最小的key-value键值对,若map为空,则返回为null;

~Object higherKey(Object key);返回该map中大于指定key的最小的key,若map为空,则返回为null;

~Map.Entry lowerEntry(Object key);返回该map中小于指定key的最大的key-value键值对,若map为空,则返回为null;

~Object lowerKey(Object key);返回该map中小于指定key的最大的key,若map为空,则返回为null;

~NavigableMap subMap(Object fromKey,boolean fromInclusive,object toKey,boolean toInclusive);返回该Map的子Map,他的key的范围是从fomKey(是否包含取决于第二个参数)到toKey(是否包含取决于第四个参数)

~SortMap subMap(Object fromKey,Object toKey);返回Map 的子Map,其Key的范围是从fromKey(包括)到toKey(不包括).

~SortedMap tailMap(Object fromKey):返回该Map的子Map.其key的范围是大于fromKey(包括)的所有的key

~NavigableMap tailMap(Object fromKey,boolean inclusive);返回该Map的子Map.其key的范围是大于fromKey(是否包括取决于第二个参数)的所有的key

~SortedMap tailMap(Object toKey):返回该Map的子Map.其key的范围是小于toKey(包括)的所有的key

~NavigableMap tailMap(Object toKey,boolean inclusive);返回该Map的子Map.其key的范围是小于toKey(是否包括取决于第二个参数)的所有的key

TreeMap中的key-value对是有序的,所以增加了访问第一个,前一个,后一个,最后一个key-value对的方法,并提供了几个从TreeMap中截取子TreeMap的方法

下面以自然排序为例,简单介绍TreeMap的使用方法

package collectionPackage;import java.util.TreeMap; class TreeMapTest implements Comparable{         int count;        public TreeMapTest(int count){        this.count=count;    }    public String toString(){        return "count["+count+"]";    }    //重写equal方法    public boolean equal(Object o){       if(this==o){           return true;         }        if(null!=o&&TreeMapTest.class==o.getClass()){            TreeMapTest tr= (TreeMapTest) o;           return tr.count==count;        }        return false;    }        //根据count属性值来判断两个对象是否相等       @Override       public int compareTo(Object o) {       TreeMapTest trTest= (TreeMapTest) o;       //记住这个方法,是很好的判断了3中情况的存在,1.count>r.count 返回1 ;2.count<r.count返回-1;3count=r.count返回0       return count>trTest.count ? 1: count<trTest.count-1?-1:0;    }               }  public class R{     public static void main(String[] args) {         TreeMap treemap= new TreeMap();         treemap.put(new TreeMapTest(3),"疯狂java讲义");         treemap.put(new TreeMapTest(-5), "andior教程");         treemap.put(new TreeMapTest(9), "平凡的世界");         System.out.println("完整的treemap:"+treemap);         System.out.println("map排序中第一个key-value键值对:"+treemap.firstEntry());         System.out.println("map中排序的第一个key值:"+treemap.firstKey());         System.out.println("map中在比new(2)小的子map:"+treemap.headMap(new TreeMapTest(2)));         System.out.println("map中比new(12)小的最大的键值对:"+treemap.lowerEntry(new TreeMapTest(12)));            } }

代码运行结果:

完整的treemap:{count[-5]=andior教程, count[3]=疯狂java讲义, count[9]=平凡的世界}
map排序中第一个key-value键值对:count[-5]=andior教程
map中排序的第一个key值:count[-5]
map中在比new(2)大的最小的键值对:{count[-5]=andior教程}
map中比new(12)小的最大的键值对:count[9]=平凡的世界


0 0
原创粉丝点击