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