在数据结构中,排序、查找、删除,基本操作都是比较,简单的情况下,我们只需要比较大小,比如:

a[1,5,3,11,8]------------------a[1,3,2,8,11]

冒泡排序:

for(inti=0;i

for(intj=1;j

if(a[j-1]>a[j]){

swap(j-1,j);

}

更多的排序方法参考:排序。

但是作为一个对象来说,“大”“小”很难断定,因此java中提供了comparable接口:

publicinterfaceComparable {
publicintcompareTo(T o);
}
java.lang. Comparable 接口定义类的自然顺序,实现该接口的类就可以按这种方式排序。
int compareTo(Object o): 比较当前实例对象与对象o,如果位于对象o之前,返回负值,如果两个对象在排序中位置相同,则返回0,如果位于对象o后面,则返回正值。
1.利用 Comparable接口创建自己的类的排序顺序,只是实现compareTo()方法的问题。可以参考下Long、String(一个个字符char比较)、Date将时间转换为long值比较,的实现:
publicintcompareTo(Long anotherLong) {
longthisVal =this.value;
longanotherVal = anotherLong.value;
return(thisVal
}
另外,TreeMap等也可以通过它实现有序集合。
2.如果数组或者集合中的(类)元素实现了该接口的话 ,我们就可以调用Collections.sort(集合排序)和 Arrays.sort(数组排序)排序。通过源码可以知道,Collections.sort还是通过Arrays实现的排序,它先将集合转换为数组:
publicstatic>voidsort(List list) {
Object[] a = list.toArray();
Arrays.sort(a);
ListIterator i = list.listIterator();
for(intj=0; j
i.next();
i.set((T)a[j]);
}
}
关于Arrays.sort方法实现的排序可以参看文章:
3.实现一个类的自定义排序
public class Person implements Comparable {
Public int age ;
Public String name ;
public int compareTo(Person person) {
int cop = age - person.getAge();
if (cop != 0)
return cop;
else
return name .compareTo(person. name );
}
public int hashCode() {
int result = 17;
result = 37 * result + age ;
result = 37 * result + name .hashCode();
return result;
}
public boolean equals(Object o) {
if (!(o instanceof Person))
return false ;
Person person = (Person) o;
return ( age == person. age ) && ( name .equals(person. name ));
}
public String toString() {
return ( age + "{" + name + "}" );
}
}

4.Comparator

A.如果类的设计师没有考虑到 Compare的问题而没有实现Comparable接口,可以通过Comparator来实现比较算法进行排序;

B.为了使用不同的排序标准做准备,比如:升序、降序或其他什么序。

这时候底层进行排序就不再是用默认的自然排序,在底层对集合进行排序将不再是用Arrays.mergeSort(Object[] src,Object[] dest,int low,int high,int off),而是是用Arrays.mergeSort(Object[] src,Object[] dest,int low,int high,int off,Comparator c),比较大小则是用了c.compare(dest[j-1], dest[j])。

继承与组合的典型区别

intcompare(T o1, T o2)
比较用来排序的两个参数。
booleanequals(Object obj)
指示是否其他对象“等于”此Comparator。
classRegDateCompimplementsComparator{publicintcompare(Object obj1, Object obj2) {if((obj1 ==null) || (obj2 ==null)) {return0;}if(obj1instanceofUser && obj1instanceofUser) {User u1 = (User) obj1;User u2 = (User) obj2;if(u1.getRegDate() !=null&& u2.getRegDate() !=null) {returnu1.getRegDate().compareTo(u2.getRegDate());}return0;}return0;}}
调用:Collections.sort(userList,newRegDateComp());
TreeSet
1、TreeSet判断两个对象不等的条件:
两个对象通过equals()方法比较返回false.或通过compareTo(Object obj)比较没有返回0
2、父类中的equals()方法,只是比较引用
public boolean equals(Object obj) {
return (this == obj);
}
3、重写方法规则:
当需要把一个对象放入TreeSet中时,重写该对象对应的equals方法时,应保证该方法与compareTo方法有一样的效果。即:equals()返回true则compareTo()返回0.
参考下String的equals方法,先比较引用,引用不相等的情况下,再比较每个字符:
publicbooleanequals(Object anObject) {
if(this== anObject) {
returntrue;
}
if(anObjectinstanceofString) {
String anotherString = (String)anObject;
intn =count;
if(n == anotherString.count) {
charv1[] =value;
charv2[] = anotherString.value;
inti =offset;
intj = anotherString.offset;
while(n-- != 0) {
if(v1[i++] != v2[j++])
returnfalse;
}
returntrue;
}
}
returnfalse;
}
4、重写compareTo()
重写compareTo()方法的对象的类R要实现Comparable接口
public int compareTo(Object obj) {
R r = (R)obj;
if(this.count > r.count) {
return 1;
}
else if(this.count == r.count) {
return ;
}
else {
return -1;
}
}