comparable :是在你要排序的类中去实现comparable接口,也就是说你得在你要排序的类中先写一个方法用来声明你想让你类中的属性根据什么规则来排序。和Comparator不同,Comparator不用去修改你要排序的类中的代码。详细的我会在第二篇文章中来介绍Comparator的使用方法。
举个例子-----------------------------------------------------------
我们现在要创建一个TreeSet()来存储对象。当你存储的对象是String类型或者是Integer类型时,因为这些类型已经实现了comparable接口,所以输出这个集合时会按照这些类的重写的compareTo()方法来顺序输出,同理当你自己创建一个类时,想用TreeSet来存储这个对象,你得先重写comparable接口的compareTo()方法。
我们先创建一个person类,里面存有Integer 类型的 age;和String类型的name。
现在我们创建了一个preson类,存了名字和年龄,我们也重写了toString方法来获取输出对象的年龄(age)和名字(name)
代码中红色标的就是我们在person类(实现了comparable接口)里重写的compareTo方法,方法里是按照年龄优先排序的,如果年龄一样,我们再来比较姓名,如果两个都一样那么这个对象就不能存进TreeSet表里。
然后我们再创建一个测试类TestTreeSet()我们创建一个TreeSet对象set来存储person对象。
可以看到我在set对象里存了许多person对象;其中有2个一模一样的对象,我们现在来运行它们两个是否能全部存进set里
可以看到存进去四个,重复的 那个没有存进去,而且都按照年龄的大小排序过了。
想自己试试的可以拷贝我的代码运行下。
//向treeset 添加元素必须是同一类的
//可以按照添加进集合中的顺序遍历元素指定
//当向TreeSet中添加一个自定义类的对象时 要求自定义类实现cmparable接口并重写方法
//添加元素时首先按照compareto方法进行比较一旦返回0,
//虽然只是比较的值相同但程序仍然会认为对象是相同的,进而后面一个不能进来
import java.util.Set;
import java.util.TreeSet;
//treeset 的自然排序 要求自定义类实现cmparable接口
public class TestTreeSet {
public static void main(String[] args) {
Set set = new TreeSet();
set.add(new person(25,"kk"));
set.add(new person(23,"pp"));
set.add(new person(22,"pp"));
set.add(new person(21,"pp"));
set.add(new person(21,"pp"));
System.out.println(set.size());
for(Object i:set) {
System.out.println(i);
}
}
}
public class person implements Comparable {
Integer age;
String name;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.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 (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "person [age=" + age + ", name=" + name + "]";
}
public person() {
super();
}
public person(int age, String name) {
super();
this.age = age;
this.name = name;
}
// 当向TreeSet中添加person类的对象时依据此方法确定按照那个属性排列
@Override
public int compareTo(Object o) {
if (o instanceof person) {
//ps这里的age name因为是Integer 和String类型的,所以都已经重写了compareTo方法,我们就可以直接拿来用。
person p = (person) o;
// return -this.age.compareTo(p.age);
// return this.name.compareTo(p.name);
int i = this.age.compareTo(p.age);
if (i == 0) {
return this.name.compareTo(p.name);//如果age是一样的,我们就来判断名字是不是一样的。
}else {
return i;
}
}
return 0;//返回的数是0代表两个元素相同,正数说明大于,负数说明小于
}
}