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. 如何删除 CentOS 6 更新后产生的多余的内核?

    第一种方法:通过命令的方式解决多余的内核 1.首先查看当前内核的版本号: [root@jxatei ~]# uname  -a Linux jxatei.server2.6.32-573.1.1.el ...

  2. Android商城开发系列(九)—— 首页频道布局的实现

    在上一篇博客当中,我们讲了关于首页轮询广告的实现,接下来讲解一下首页频道布局的实现,如下图所示: 这个布局用的是gridview去完成的,新建一个channel_item,代码如下所示: <?x ...

  3. jsp之初识UserBean

    package com.java.model; public class Student { private String name; private int age; public String g ...

  4. Android(java)学习笔记111:Java异常分类

    Java异常可分为3种: (1)编译时异常:Java.lang.Exception (2)运行期异常:Java.lang.RuntimeException (3)错误:Java.lang.Error

  5. [论文理解] Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

    Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 简介 Faster R-CNN是很经典的t ...

  6. 字符编码:BSTR

    typedef wchar_t WCHAR; typedef WCHAR OLECHAR; typedef OLECHAR __RPC_FAR *BSTR;;

  7. python 遍历list

    #!/usr/bin/env python# -*- coding: utf-8 -*-if __name__ == '__main__':    list = ['html', 'js', 'css ...

  8. Dojo的dojoConfig函数

    在我们引入 Dojo 的时候都会先做一些全局的配置,所使用的就是 Dojo 的 Config 接口. dojoConfig为以前的dgConfig函数. <script type="t ...

  9. Service Unavailable HTTP Error 503. The service is unavailable.

    原因: public void SetCurrentType(string[] projTypes) { _ProjTypes = _ProjTypes; } 确保没有无限递归或无限循环

  10. Element-ui tree组件自定义节点使用方法

    工作上使用到element-ui tree 组件,主要功能是要实现节点拖拽和置顶,通过自定义内容方法(render-content)渲染树代码如下~   <template> <di ...