TreeMap简单simple
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的更多相关文章
- 池以及barrier简单
		用了下CyclicBarrier,注意线程池中的线程数量设置,还有就是DB连接的时候,需要考虑单个DB能承受的最大连接数目和每个连接上能同时打开的cursor等限制,需要时可以通过jstack查看堆栈 ... 
- TreeMap实现原理及源码分析之JDK8
		转载 Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例 一.TreeMap 简单介绍 什么是Map? 在数组中我们通过数组下标来对数组内容进行索引的,而在Map中我们通过对象来对 ... 
- Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用
		catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ... 
- [转](四)unity4.6Ugui中文教程文档-------概要-UGUI Visual Components
		转自孙广东. 转载请注明出处:http://write.blog.csdn.net/postedit/38922399 更全的内容请看我的游戏蛮牛地址:http://www.unitymanual ... 
- OpenBSD为何还在用CVS之感
		一个轻松无聊的晚上突然想到一个问题——在当今这个Git大红大紫的时代,OpenBSD为何还在用CVS代码仓库?连他同阵营的FreeBSD都已经改用SVN,宣布逐渐废掉CVS了……问了下google,搜 ... 
- 解决SQLite database is locked
		前些时候,同事在站点服务端使用SQlite存储一些临时数据,但是在多人并发的时候Sqlite会抛出异常:The database file is locked , database is locked ... 
- Microsoft 家族新成员 Datazen 移动BI 介绍
		开篇介绍 Microsoft 在上个月即 2015年4月份收购了 Datazen www.datazen.com, Datazen 专注于移动 BI 和数据可视化领域,并且它的基本部署与配置架构都是基 ... 
- Sql清理日志文件
		场景: 我们导入MR数据时发现磁盘空间不够用了,导致的结果就是我们的程序很可能会抛出异常了,我们需要导入数据的时候进行日志瘦身. 问1:导入数据的时候,瘦身是否会造成数据库的异常? DBA提供解决方案 ... 
- SQL Server数据库事务日志存储序列
		原文 原文:http://blog.csdn.net/tjvictor/article/details/5251351 如果你的数据库运行在完整或是批量日志恢复模式下,那么你就需要使用作业(job ... 
随机推荐
- aspx页面中, <%= % > 与  <%# % > 的区别
			关于这个问题,在多数的 ASP.NET 的教材中,都提到了一些. <%= % >与 <%# % >的区别在于:绑定时机不同, <%# % >是在控件调用DataBi ... 
- iOS开发之自定义画板
			今天整好有时间, 写了一个自定义的画板! [我的github] GLPaint主要采用QuartzCore框架, 对画布上的元素进行渲染, 然后通过UIImageWriteToSavedPhotos ... 
- iphone 与 ipad --  UIPopoverPresentationViewController
			iOS8.0之后, 苹果推出了UIPopoverPresentationViewController, 在弹出控制器时, 统一采用 presentViewController, 但是要实现iPhone ... 
- 定位 - CoreLocation - 指南针
			#import "ViewController.h" #import <CoreLocation/CoreLocation.h> @interface ViewCont ... 
- 破解EXCEL2007的密码
			破解EXCEL2007的密码 xshzhao (斑竹)顶楼举报 我有一个EXCEL2007文件(后缀是XLSX),由于设置了打开密码.现在密码搞忘了,这个文件对我很重要. 我试过了Office Pas ... 
- 由tomcat启动想到的
			1.batch:批处理文件,表示一批 2.profile:轮廓 3.用户变量和系统变量的关系是什么? 答:点击"我的电脑→属性→高级"标签的"环境变量&quo ... 
- hdu 1116
			欧拉回路,利用并查集来实现: 代码: #include<cstdio> #include<cstring> #include<vector> using names ... 
- uvalive 6185
			高斯消元,以前从来没写过,今天的模拟比赛里面,添琦给了我一个模板! 虽然是个裸的,但是因为从来没写过,一个小细节竟然搞了我几个小时: 终于最后在小珺同志的帮助下成功a掉了,太开心了! 存一下,作为模板 ... 
- [科普贴]为何Flash被淘汰?附Chrome看视频最完美教程!
			Adobe 公司放弃 移动 平台的 Flash 支持已经是板上钉钉的事了, Google Play 的 Flash 插件也会在 8 月份下架,这在一定程度上也会促进 HTML5 的发展和普及,因此我个 ... 
- Linux平台下Java调用C函数
			JNI是Java native interface的简写,可以译作Java原生接口.Java可以通过JNI调用C/C++的库,这对于那些对性能要求比较高的Java程序无疑是一个 福音. 使用JNI也是 ... 
