Java集合treemap实现排序的两种方式的比较

前一章所将是关于map的基础概念已经它的基本方法,增删获取遍历,其中遍历尤为要花点时间去练习。遍历的三种方法,其中第二种方法无法获取完整的键值,因为map的get方法只能通过键取值而无法逆向通过值取键,所以无法获取map的键,这是一大缺陷
hashmap没什么好讲的,今天来讲一讲treemap,它与treeset类似,treeset自身具有排序的特性,实现方法有两种,一种是元素自身具有比较性,另一种是容器具有比较性,treemap在实现键的排序上也是通过这两种方式实现。map集合的操作多半是对key进行的,从key到value,例如用key可以取出value,而用value则不行,key是主键。
其中第一种方式较为简单,只需要让自定义的类实现comparable接口即可,对其compareto方法进行所需要的重写,这样元素自身从产生其就具备了比较性,而且这个比较是默认完成的,无需再进行操作
class Person implements Comparable {
private String name;
private int age;
private String gender;

public Person() {

}

public Person(String name, int age, String gender) {

	this.name = name;
	this.age = age;
	this.gender = gender;
}

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

public int getAge() {
	return age;
}

public void setAge(int age) {
	this.age = age;
}

public String getGender() {
	return gender;
}

public void setGender(String gender) {
	this.gender = gender;
}

@Override
public int hashCode() {
	return name.hashCode() + age * 37;
}

public boolean equals(Object obj) {
	System.err.println(this + "equals :" + obj);
	if (!(obj instanceof Person)) {
		return false;
	}
	Person p = (Person) obj;
	return this.name.equals(p.name) && this.age == p.age;

}

public String toString() {
	return "Person [name=" + name + ", age=" + age + ", gender=" + gender
			+ "]";
}

**@Override
public int compareTo(Object obj) {
	
	Person p = (Person) obj;
	System.out.println(this+" compareTo:"+p);
	if (this.age > p.age) {
		return 1;
	}
	if (this.age < p.age) {
		return -1;
	}
	return this.name.compareTo(p.name);
}**

}
而第二种方式通过使容器具备比较性较为复杂,通过实现comparator接口,重写其compare方法,这个实现comparator接口并不是在自定义的元素类中实现,而是需要再单独写一个类来实现该接口,最后再将该类的子对象作为参数传递给treeset的构造函数,这样才得以实现。而且与comparable相比它具有更高的优先级,当两者同时存在时,以comparator为主
class MyComparator implements Comparator {

**public int compare(Object o1, Object o2) {
	Book b1 = (Book) o1;
	Book b2 = (Book) o2;
	System.out.println(b1+" comparator "+b2);
	if (b1.getPrice() > b2.getPrice()) {
		return 1;
	}
	if (b1.getPrice() < b2.getPrice()) {
		return -1;
	}
	return b1.getName().compareTo(b2.getName());**
}

}

class Book {
private String name;
private double price;

public Book() {

}

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

public double getPrice() {
	return price;
}

public void setPrice(double price) {
	this.price = price;
}

public Book(String name, double price) {

	this.name = name;
	this.price = price;
}

@Override
public String toString() {
	return "Book [name=" + name + ", price=" + price + "]";
}

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值