**看完了上面我们发现 要使用TreeMap 那么必须在创建TreeMap时指定Comparator
或者TreeMap的key对象实现了Comparable接口 TreeSet同样也是如此
**
首先创建一个Person 实体类
其中有两个属性 name age 其并未实现Comparable 接口
package com.compare.test;
public class Person{
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
PersonComparator 实现了Comparator 其中 只有一个方法
package com.compare.test;
import java.util.Comparator;
public class PersonComparator implements Comparator<Person> {
public int compare(Person o1, Person o2) {
if(o1.getAge()>o2.getAge()){
return 1;
}else{
return -1;
}
}
}
测试
package com.compare.test;
import java.util.Iterator;
import java.util.TreeSet;
public class TestPerson {
public static void main(String[] args) {
Person p1 = new Person("z3", 15);
Person p2 = new Person("qw", 30);
Person p4 = new Person("ww", 23);
Person p3 = new Person("xc", 10);
TreeSet<Person> s = new TreeSet<Person>(new PersonComparator());
s.add(p3);
s.add(p1);
s.add(p2);
s.add(p4);
Iterator it = s.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
//System.out.println(s);
}
}
运行结果
Person [name=xc, age=10]
Person [name=z3, age=15]
Person [name=ww, age=23]
Person [name=qw, age=30]
发现Person 类对象以age 从小到大排序
当我们把PersonComparator 实现了Comparator
方法返回值修改为
public int compare(Person o1, Person o2) {
if(o1.getAge()>o2.getAge()){
return -1;
}else{
return 1;
}
}
这时候 排序则为降序排列
Person [name=qw, age=30]
Person [name=ww, age=23]
Person [name=z3, age=15]
Person [name=xc, age=10]
Person代码实现了Comparable 其他同上
public class Person implements Comparable<Person>{
...
public int compareTo(Person o) {
if(this.age > o.age){
return 1;
}else{return -1;}
}
}
这时候创建TreeSet对象时就不用在构造方法中指定Comparator了
TreeSet<Person> s = new TreeSet<Person>();
其他代码同上
运行
Person [name=xc, age=10]
Person [name=z3, age=15]
Person [name=ww, age=23]
Person [name=qw, age=30]
结果为升序
当修改compareto方法中的返回值后 修改方式同上
我们可以发现结果为降序了
我们发现当person类 p1的age属性大于p2的值时
P1代表前一个值,p2代表后一个值
即p1.age > p2.age
以下方法
public int compareTo(Person o) {
if(this.age > o.age){
return 1;
}else{return -1;}
}
**即treeset排序根据key.compareTo()方法排序时
若key.compareTo()方法的返回值为正则前后两个元素位置要发生交换
返回值为负则前后两个元素位置不发生交换
**