java compare设计_java compare

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

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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值