zoukankan      html  css  js  c++  java
  • 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());
    		}
    		
    	}
    }



  • 相关阅读:
    HTML5 重力感应效果,实现摇一摇效果
    WEB 移动端 CSS3动画性能 优化
    jquery 插件封装模板
    textarea 提交到数据库的内容,输出到 html 中显示正常的格式
    js根据银行卡号判断属于哪个银行,并返回银行缩写及银行卡类型
    微信小程序如何引用iconfont图标
    nodejs: express basic
    javascript设计模式:适配器模式
    javascript设计模式:装饰者模式
    javascript设计模式:代理模式
  • 原文地址:https://www.cnblogs.com/marcotan/p/4256893.html
Copyright © 2011-2022 走看看