小言_互联网的博客

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

331人阅读  评论(0)

前一章所将是关于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 + "]";
}

}


转载:https://blog.csdn.net/eyexin2018/article/details/101637910
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场