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. yum安装lamp环境

    装了好些次lamp环境了,都没好好总结下,现在总结下 ^ ^ 1.替换163的yum源 1.检查系统版本 cat /etc/redhat-releas   (我的版本是CentOS release 6 ...

  2. .NET EF 访问Oracle之问题小结

    由于最近手头上的项目要求使用Oracle数据库,所以我搭建了asp.net mvc + EF + bootstrap + log4Net + unity的三层框架,如下图所示: 其中单元测试使用微软自 ...

  3. Axure草记

    页面控件和DataSet绑定,DataSet和输入控件绑定(通过临时变量) 双击Repeater进入之后,你会发现下面已经默认添加了3行,这代表着,每增加一行将会重复3遍: Repeater可以只是部 ...

  4. iOS 9 适配

    一.iOS9 bitcode首先最大的问题就是坑货xcode7,xcode7默认是打开bitcode的,bitcode是苹果为了解决他自己以后的应用可以随意更换硬件的处理做的准备也就是arm指令集和x ...

  5. Linux发行版

    Linux 发行版(英语:Linux distribution,也被叫做GNU/Linux 发行版),为一般用户预先集成好的Linux操作系统及各种应用软件.一般用户不需要重新编译,在直接安装之后,只 ...

  6. 多个div独立控制其显示/隐藏

    今天要说一个神奇的html标签op,静态页下可以配合jquery分别控制每个层的显示/隐藏切换. 如果用动态中使用,用文章id做区分就可以了. <html> <head> &l ...

  7. [Android应用]《花界》V1.0 正式版隆重发布!

    http://www.cnblogs.com/qianxudetianxia/archive/2012/04/05/2433669.html 1. 软件说明(1). 花界是一款看花软件:“看花,议花, ...

  8. leetcode面试准备:Container With Most Water

    leetcode面试准备:Container With Most Water 1 题目 Given n non-negative integers a1, a2, ..., an, where eac ...

  9. 4.android.mk编写规范

    Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名.引用的头文件目录.需要编译的.c/.cpp文件和.a静态库文件等.要掌握jni,就必须熟练掌握Andr ...

  10. 【转】 Android快速开发系列 10个常用工具类 -- 不错

    原文网址:http://blog.csdn.net/lmj623565791/article/details/38965311 转载请标明出处:http://blog.csdn.net/lmj6235 ...