TreeMap及常用API

①   TreeMap类通过使用红黑树实现Map接口;

②   TreeMap提供按排序顺序存储键/值对的有效手段,同时允许快速检索;

③   不像散列(HashMap),树映射保证它的元素按关键字升序排序;

④   TreeMap构造方法:

a)   TreeMap()

b)   TreeMap(Comparator comp)

c)   TreeMap(Map m)

d)   TreeMap(SortedMap sm)

⑤   TreeMap实现SortedMap并且扩展AbstractMap,它本身并没有定义其他方法;

         TreeMap<String,String> tmap=new TreeMap<String, String>();
tmap.put("zhang", "张三");
tmap.put("jack", "小明");
tmap.put("mary", "小红");
tmap.put("free", "小叶");
tmap.put("mary", "小草");
//tmap.put(null,"小草");//键不能传入null,会抛异常
System.out.println(tmap);

默认按照键的自然顺序升序输出

输出结果:

{free=小叶, jack=小明, mary=小草, zhang=张三}

输出所有键值对

     Set<Entry<String,String>> entrys=tmap.entrySet();
for(Entry<String,String> entry:entrys){
System.out.println(entry.getKey()+"--"+entry.getValue());
}

输出结果:

free--小叶

jack--小明

mary--小草

zhang--张三

编写一个Person类

 class Person{
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}

在主方法中创建并添加元素,输出

         TreeMap<Person,String> pdata=new TreeMap<Person, String>();
pdata.put(new Person("zhangsan",20), "张三");
pdata.put(new Person("lisi",25), "李四");
pdata.put(new Person("wangwu",30), "王五");
pdata.put(new Person("zhangsan",33), "张三");
System.out.println(pdata);

运行结果:

出错,原因是Person类中没有实现compareTo(T o)比较方法

 

方法一:实现Comparable接口

class Person implements Comparable<Person>{ }

重写方法如下:按年龄进行排序

     @Override
public int compareTo(Person o) {
if (this.age - o.getAge() > 0) {
return 1;
} else if (this.age - o.getAge() < 0) {
return -1;
}
return 0;
}

然后再执行,输出结果:

{com.iotek.map.Person@2a139a55=张三, com.iotek.map.Person@15db9742=李四, com.iotek.map.Person@6d06d69c=王五, com.iotek.map.Person@7852e922=张三}

完整的Person类如下:

     class Person implements Comparable<Person> {
private String name;
private int age; public Person(String name, int age) {
super();
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public int compareTo(Person o) {
if (this.age - o.getAge() > 0) {
return 1;
} else if (this.age - o.getAge() < 0) {
return -1;
}
return 0;
}
}

方法二:Person中不使用Comparable接口,在主方法中使用匿名内部类:

 TreeMap<Person, String> pdata = new TreeMap<Person, String>(new Comparator<Person>() {

             @Override
public int compare(Person o1, Person o2) {
if(o1.getAge()>o2.getAge()){
return 1;
}
else if(o1.getAge()<o2.getAge()){
return -1;
}
return 0;
}
});

输出结果与上面相同

上面都是使用int年龄进行排序,使用String名字排序方法如下:

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

输出结果:

{com.iotek.map.Person@2a139a55=李四, com.iotek.map.Person@15db9742=王五, com.iotek.map.Person@6d06d69c=张三}

因为zhangsan相同则被替换了,修改如下:

         @Override
public int compare(Person o1, Person o2) {
if(o1.getName().compareTo(o2.getName())>0){
return 1;
}
else if(o1.getName().compareTo(o2.getName())<0){
return -1;
}
else{
//年龄相同时还是会替换
return o1.getAge()-o2.getAge();
}
}

Comparator和Comparable接口

①   TreeMap的key存储引用类型数据,需要满足一定条件

a)   要么引用类型实现Comparable接口

b)   要么为该TreeMap容器提供实现Comparator接口的比较器对象

Map容器——TreeMap及常用API,Comparator和Comparable接口的更多相关文章

  1. Map容器——HashMap及常用API,及put,get方法解析,哈希码的产生和使用

    Map接口 ①   映射(map)是一个存储键/值对的对象.给定一个键,可以查询到它的值,键和值都是对象; ②   键必须是唯一的,值可以重复; ③   有些映射可以接收null键和null值,而有的 ...

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

    森林森 一份耕耘,一份收获 博客园 首页 新随笔 联系 管理 订阅 随笔- 397  文章- 0  评论- 78  JAVA基础学习day16--集合三-Map.HashMap,TreeMap与常用A ...

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

    一.Map简述 1.1.简述 public interface Map<K,V> 类型参数: K - 此映射所维护的键的类型 key V - 映射值的类型 value 该集合提供键--值的 ...

  4. Set容器——TreeSet及常用API

    TreeSet及常用Api ①   TreeSet为使用树来进行存储的Set接口提供了一个工具,对象按升序存储,访问和检索很快; ②   在存储了大量的需要进行快速检索的排序信息的情况下,TreeSe ...

  5. Set容器——HashSet及常用API

    Set容器特点: ①   Set容器是一个不包含重复元素的Collection,并且最多包含一个null元素,它和List容器相反,Set容器不能保证其元素的顺序; ②   最常用的两个Set接口的实 ...

  6. List容器——LinkedList及常用API,实现栈和队列

    LinkedList及常用API ①   LinkedList----链表 ②   LinkedList类扩展AbstractSequentialList并实现List接口 ③   LinkedLis ...

  7. List容器——ArrayList及常用API

    List: ①   List容器是有序的collection(也称为序列).此接口的用户可以对List容器中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜 ...

  8. Java集合中Comparator和Comparable接口的使用

    在Java集合中,如果要比较引用类型泛型的List,我们使用Comparator和Comparable两个接口. Comparable接口 -- 默认比较规则,可比较的 实现该接口表示:这个类的实例可 ...

  9. [js高手之路] es6系列教程 - Map详解以及常用api

    ECMAScript 6中的Map类型是一种存储着许多键值对的有序列表.键值对支持所有的数据类型. 键 0 和 ‘0’会被当做两个不同的键,不会发生强制类型转换. 如何使用Map? let map = ...

随机推荐

  1. LR使用流程简介之录制方式说明

    1.LR脚本录制方式说明1)HTML-based script基于HTML的脚本 从内存中读取并下载资源,较少的关联处理,可以加入图片检查,回放时需要解析返回的信息 a-基于用户行为的方式 web_l ...

  2. ZOJ 3471 Most Powerful (状压DP,经典)

    题意: 有n个原子,每当两个原子碰撞时就会产生能量,并且消耗其中一个原子.已知每两个原子碰撞时消耗其中指定一个原子所产生的能量,问最多能产生多少能量? 思路: 一开始以为是找一个有序序列,使得能量最大 ...

  3. 洛谷 P1426 小鱼会有危险吗

    题目描述 有一次,小鱼要从A处沿直线往右边游,小鱼第一秒可以游7米,从第二秒开始每秒游的距离只有前一秒的98%.有个极其邪恶的猎人在距离A处右边s米的地方,安装了一个隐蔽的探测器,探测器左右x米之内是 ...

  4. ansible 通过堡垒机/跳板机 访问目标机器需求实战(ssh agent forward)

    一. 需求背景: 在我们使用ansible的过程中经常会遇到这样的情况,我们要管理的机器都在内网中,这些内网机器的登录都是通过跳板机或者堡垒机登录.我们的ansible机器不能直接管理到这些后端的机器 ...

  5. sum特殊用法

    在python中,list可以存储False和True a = [False] python的sum除了可以加数字,还可以计算列表中False,True的个数,默认是计算False个数 >> ...

  6. $|^|\z|\Z|/a|/l

    #!/usr/bin/perl use strict; use warnings; foreach(<>) { if (/(\w*)/a){print "$1\n";} ...

  7. java中插入myslq的datetime类型的

    java.util.Date d = new java.util.Date(); Timestamp tt=new Timestamp(d.getTime()); ps.setTimestamp(4, ...

  8. cocos2dx for lua 加密图片

    图片加密的方法有很多种,在cocos2dx中,经常会使用TexturePacker来加密图片,方法如下: 打开TexturePacker,点击Add Sprite添加图片,在output栏下的Text ...

  9. PAT 乙级 1086

    题目 题目地址:PAT 乙级 1086 思路 本题比较简单,但还是存在小小的坑点,简单说一下: 倒置中需要注意的唯一问题就是:100倒置后不是001,而是1:这个问题处理之后还要注意另一个点就是,10 ...

  10. AES加密、解密工具类

    AES加密.解密工具类代码如下: package com.util; import java.io.IOException; import java.io.UnsupportedEncodingExc ...