TreeMap能够按照主键对里面的数据进行排序,基于上篇文章:java集合类之TreeMap中有关于TreeMap内部实现的详细介绍。本文主要是写了些使用TreeMap的简单demo。

要想实现TreeMap的自动排序功能,要么主键对象实现Comparator接口,要么用Comparable来构造TreeMap。以下则分别对这两种方式创建TreeMap。

1. 继承Comparable

public class Person implements Comparable<Person>{

	private String name;

	private String sex;

	public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((sex == null) ? 0 : sex.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (sex == null) {
if (other.sex != null)
return false;
} else if (!sex.equals(other.sex))
return false;
return true;
} public Person(String name, String sex) {
super();
this.name = name;
this.sex = sex;
} @Override
public String toString() {
return "Person [name=" + name + ", sex=" + sex + "]";
} @Override
public int compareTo(Person o) {
Person s = (Person) o;
if(this.name.compareTo(s.getName())>0){
return 1;
}else if(this.name.compareTo(s.getName())<0){
return -1;
}else {
if(this.sex.compareTo(s.getSex())>0){
return 1;
}else if(this.sex.compareTo(s.getSex()) < 0){
return -1;
}else{
return 0;
}
}
}
}

2. 实现Comparator接口

public class MyCompartor implements Comparator<Person>{

	@Override
public int compare(Person o1, Person o2) {
if(null == o1){
System.out.println("o1 is null");
return 1;
}
if(null == o2){
System.out.println("o2 is null");
return -1;
}
if(o1.getName().compareTo(o2.getName())>0){
return 1;
}else if(o1.getName().compareTo(o2.getName())<0){
return -1;
}else {
if(o1.getSex().compareTo(o2.getSex())>0){
return 1;
}else if(o1.getSex().compareTo(o2.getSex()) < 0){
return -1;
}else{
return 0;
}
}
}
}

一般主键类尽量使用同一类型,如果使用不同类型则需要分别比较。

public class Student implements Comparable<Object>{

	private String name;

	private String sex;

	public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((sex == null) ? 0 : sex.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (sex == null) {
if (other.sex != null)
return false;
} else if (!sex.equals(other.sex))
return false;
return true;
} public Student(String name, String sex) {
super();
this.name = name;
this.sex = sex;
} @Override
public String toString() {
return "Student [name=" + name + ", sex=" + sex + "]";
} @Override
public int compareTo(Object o) {
if(o instanceof Student){
Student s = (Student) o;
if(this.name.compareTo(s.getName())>0){
return 1;
}else if(this.name.compareTo(s.getName())<0){
return -1;
}else {
if(this.sex.compareTo(s.getSex())>0){
return 1;
}else if(this.sex.compareTo(s.getSex()) < 0){
return -1;
}else{
return 0;
}
}
}else if(o instanceof Person){
Person s = (Person) o;
if(this.name.compareTo(s.getName())>0){
return 1;
}else if(this.name.compareTo(s.getName())<0){
return -1;
}else {
if(this.sex.compareTo(s.getSex())>0){
return 1;
}else if(this.sex.compareTo(s.getSex()) < 0){
return -1;
}else{
return 0;
}
}
}else {
return 0;
}
}
}
public class Person implements Comparable<Object>{

	private String name;

	private String sex;

	public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((sex == null) ? 0 : sex.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (sex == null) {
if (other.sex != null)
return false;
} else if (!sex.equals(other.sex))
return false;
return true;
} public Person(String name, String sex) {
super();
this.name = name;
this.sex = sex;
} @Override
public String toString() {
return "Person [name=" + name + ", sex=" + sex + "]";
} @Override
public int compareTo(Object o) {
if(o instanceof Student){
Student s = (Student) o;
if(this.name.compareTo(s.getName())>0){
return 1;
}else if(this.name.compareTo(s.getName())<0){
return -1;
}else {
if(this.sex.compareTo(s.getSex())>0){
return 1;
}else if(this.sex.compareTo(s.getSex()) < 0){
return -1;
}else{
return 0;
}
}
}else if(o instanceof Person){
Person s = (Person) o;
if(this.name.compareTo(s.getName())>0){
return 1;
}else if(this.name.compareTo(s.getName())<0){
return -1;
}else {
if(this.sex.compareTo(s.getSex())>0){
return 1;
}else if(this.sex.compareTo(s.getSex()) < 0){
return -1;
}else{
return 0;
}
}
}else {
return 0;
}
}
}

测试:

public class TreeMapExample {

	@Test
public void test1(){
TreeMap<Object, Object> treeMap = new TreeMap<Object, Object>();//主键不同类型
Student s1 = new Student("a", "m");
Student s2 = new Student("a", "c");
Person p1 = new Person("d", "w");
Person p2 = new Person("b", "m");
treeMap.put(s1, s1);
treeMap.put(s2, s2);
treeMap.put(p1, p1);
treeMap.put(p2, p2);
for(Map.Entry<Object, Object> entry : treeMap.entrySet()){
System.out.println(entry.getKey().toString());
}
} @Test
public void test2(){
MyCompartor compartor = new MyCompartor();
TreeMap<Person, Person> treeMap = new TreeMap<Person, Person>(compartor);//主键中放入null
Person s1 = new Person("a", "m");
Person s2 = new Person("a", "c");
Person p1 = new Person("d", "w");
Person p2 = new Person("b", "m");
Person p3 = new Person("b", "c");
treeMap.put(s1, s1);
treeMap.put(s2, s2);
treeMap.put(p1, p1);
treeMap.put(p2, p2);
treeMap.put(null, p3);
System.out.println(treeMap.size());
for(Map.Entry<Person, Person> entry : treeMap.entrySet()){
System.out.println(entry.getKey()+":"+entry.getValue());
} }
}

TreeMap简单simple的更多相关文章

  1. 池以及barrier简单

    用了下CyclicBarrier,注意线程池中的线程数量设置,还有就是DB连接的时候,需要考虑单个DB能承受的最大连接数目和每个连接上能同时打开的cursor等限制,需要时可以通过jstack查看堆栈 ...

  2. TreeMap实现原理及源码分析之JDK8

    转载 Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例 一.TreeMap 简单介绍 什么是Map? 在数组中我们通过数组下标来对数组内容进行索引的,而在Map中我们通过对象来对 ...

  3. Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用

    catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...

  4. [转](四)unity4.6Ugui中文教程文档-------概要-UGUI Visual Components

    转自孙广东.   转载请注明出处:http://write.blog.csdn.net/postedit/38922399 更全的内容请看我的游戏蛮牛地址:http://www.unitymanual ...

  5. OpenBSD为何还在用CVS之感

    一个轻松无聊的晚上突然想到一个问题——在当今这个Git大红大紫的时代,OpenBSD为何还在用CVS代码仓库?连他同阵营的FreeBSD都已经改用SVN,宣布逐渐废掉CVS了……问了下google,搜 ...

  6. 解决SQLite database is locked

    前些时候,同事在站点服务端使用SQlite存储一些临时数据,但是在多人并发的时候Sqlite会抛出异常:The database file is locked , database is locked ...

  7. Microsoft 家族新成员 Datazen 移动BI 介绍

    开篇介绍 Microsoft 在上个月即 2015年4月份收购了 Datazen www.datazen.com, Datazen 专注于移动 BI 和数据可视化领域,并且它的基本部署与配置架构都是基 ...

  8. Sql清理日志文件

    场景: 我们导入MR数据时发现磁盘空间不够用了,导致的结果就是我们的程序很可能会抛出异常了,我们需要导入数据的时候进行日志瘦身. 问1:导入数据的时候,瘦身是否会造成数据库的异常? DBA提供解决方案 ...

  9. SQL Server数据库事务日志存储序列

    原文 原文:http://blog.csdn.net/tjvictor/article/details/5251351   如果你的数据库运行在完整或是批量日志恢复模式下,那么你就需要使用作业(job ...

随机推荐

  1. a标签拨打电话、发短信、发邮件

    1.<a href=”tel:xxxx”>拨打电话</a> 2.<a href=”sms:xxxx”>发短信</a> 3.<a href=”mai ...

  2. Lucene4.9学习笔记——Lucene建立索引

    基本上创建索引需要三个步骤: 1.创建索引库IndexWriter对象 2.根据文件创建文档Document 3.向索引库中写入文档内容 这其中主要涉及到了IndexWriter(索引的核心组件,用于 ...

  3. ORA-01033 ORA-01109 ORA-01034 ORA-12514 ORA-24324 ORA-01041 ORA-01157 ORA-01110

    客户数据库挂掉了 在plsql客户端使用普通账号登录时提示如下错误 因为好久没弄数据库了,慌了一小下. 接下来搜索过往的知识,回忆.在cli下输入了以下命令 sqlplus system/system ...

  4. Memcached(一)在Windows上安装和测试memcached

    1)下载memcached的windows安装程序 memcached-1.2.4-Win32-Preview-20080309_bin.zip 或其他版本 2)解压memcached  用管理员身份 ...

  5. Re-installation failed due to different application signatures./package name has exist

    http://www.cnblogs.com/qianxudetianxia/archive/2011/04/09/2010468.html

  6. TFS环境搭建

    这篇文章主要介绍了微软源代码管理工具TFS2013安装与使用图文教程,本文详细的给出了TFS2013的安装配置过程.使用教程,需要的朋友可以参考下 最近公司新开发一个项目要用微软的TFS2013进行项 ...

  7. jQuery预加载插件

      插件描述:jQuery Fadeloader的插件可以让你轻松实现预加载到您的网站或部分使用级联渐显效果来显示特定的内容块(例如,头> MENU>内容>页脚) jQuery Fa ...

  8. 如何使用 Cloud Insight SDK 实现 Druid 监控?

    Druid 简介与用途 首先说明,这里所说的 Druid 并不是阿里巴巴的数据库连接池项目,而是 Eric Tschetter 创立的一个开源的分布式实时处理系统,希望为烧钱的大数据处理,提供一种更廉 ...

  9. SPRING IN ACTION 第4版笔记-第一章-003-AOP介绍

    一.目标 要在BraveKnight调用embarkOnQuest()前后各做一些处理(调用Minstrel的方法) 二. 1.minstrel.xml <?xml version=" ...

  10. 【Xamarin开发 Android 系列 6】 Android 结构基础(上)

    原文:[Xamarin开发 Android 系列 6] Android 结构基础(上) 前面大家已经熟悉了什么是Android,而且在 [Xamarin开发 Android 系列 4] Android ...