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. javascript获取url参数的方法

    发布:thatboy   来源:Net     [大 中 小] 本文介绍下,在javascript中取得url中某一个参数的方法,这里分享一个小例子,供大家学习参考下.本文转自:http://www. ...

  2. mysqli_fetch_assoc与mysqli_result::fetch_assoc区别

    mysqli_fetch_assoc与mysqli_result::fetch_assoc区别

  3. 转载:Source Insight查看ARM汇编源程序 && 高亮显示程序 && Source Insight打开project窗口出错

    (1)Source Insight查看ARM汇编源程序.做ARM嵌入式开发时,有时得整汇编代码,但在SIS里建立PROJECT并ADD TREE的时候,根据默认设置并不会把该TREE里面所有汇编文件都 ...

  4. 定位 -CLGeocoder - 编码

    #import "ViewController.h" #import <CoreLocation/CoreLocation.h> @interface ViewCont ...

  5. ubuntu13.10 登陆后黑屏,没有菜单栏,可以启动termina,怎么解决?

    最近在学习openGL,自己的电脑是intel集显加nvidia GT630M,本来想应该可以支持到opengl4以上的,可是发现nvidia的显卡由于驱动问题,好像一直没有用到,所以只支持了open ...

  6. 守望先锋overwatch美服外服设置方法

    打开:C:\Users\你的用户名\AppData\Roaming\Battle.net\Battle.net.config 替换为下方内容: { "Client": { &quo ...

  7. jQuery预加载插件

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

  8. SQL 维护用得到的监控语句

    使用DMV来分析SQL Server启动以来累计使用CPU资源最多的语句.例如下面的语句就可以列出前50名 s2.dbid, ( , ( ( ) )) AS sql_statement, execut ...

  9. The Promise of Deep Learning

    The Promise of Deep Learning By Yoshua Bengio Humans have long dreamed of creating machines that thi ...

  10. CPU,MPU,MCU,SOC,SOPC联系与差别

    转自CPU,MPU,MCU,SOC,SOPC联系与差别 1.CPU(Central Processing Unit),是一台计算机的运算核心和控制核心.CPU由运算器.控制器和寄存器及实现它们之间联系 ...