您的位置:首页 > 编程语言 > Java开发

【Java】java中的compareTo和compare的区别

2015-07-31 12:51 645 查看

compare





从这里可以看出,compare是Comparator接口中的一个类,再看一下源代码中的解释


Compares its two arguments for order. Returns a negative integer,
zero, or a positive integer as the first argument is less than, equal
to, or greater than the second


如果第一个参数小于第二个参数,就返回一个负数,如果等于就返回0,如果大于就返回一个正数。

再看compareTo方法



首先,他是Comparable接口中的一个方法,

然后String类继承了Comparable接口,并实现了comparteTo方法



来看具体方法的实现:

public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;

int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}


让需要进行排序的对象实现Comparable接口,重写其中的compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用java.util.Arrays.sort()来排序对象数组,实例如下:

class Student implements Comparable<Student>{
private String name;
private int age;
private float score;

public Student(String name, int age, float score) {
this.name = name;
this.age = age;
this.score = score;
}

public String toString()
{
return name+"\t\t"+age+"\t\t"+score;
}

@Override
public int compareTo(Student o) {
// TODO Auto-generated method stub
if(this.score>o.score)//score是private的,为什么能够直接调用,这是因为在Student类内部
return -1;//由高到低排序
else if(this.score<o.score)
return 1;
else{
if(this.age>o.age)
return 1;//由低到高排序
else if(this.age<o.age)
return -1;
else
return 0;
}
}
}

public class ComparableDemo01 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Student stu[]={new Student("zhangsan",20,90.0f),
new Student("lisi",22,90.0f),
new Student("wangwu",20,99.0f),
new Student("sunliu",22,100.0f)};
java.util.Arrays.sort(stu);
for(Student s:stu)
{
System.out.println(s);
}
}
}


结果



但是在设计类的时候,往往没有考虑到让类实现Comparable接口,那么我们就需要用到另外的一个比较器接口Comparator。

从上面的实例我们可以发现,compareTo(T o)只有一个参数,而Comparator接口中必须要实现的compare(T o1,T o2)就有两个参数。

新建3个类

Student.java

package map;

public class Student {
private String name;
private int age;
private float score;

public Student(String name, int age, float score) {
this.name = name;
this.age = age;
this.score = score;
}

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 float getScore() {
return score;
}

public void setScore(float score) {
this.score = score;
}

@Override
public String toString() {
return name + "\t\t" + age + "\t\t" + score;
}

}


StudentComparator.java

package map;

import java.util.Comparator;

public class StudentComparator implements Comparator<Student> {

public int compare(Student o1, Student o2) {
if (o1.getScore() > o2.getScore())
return -1;
else if (o1.getScore() < o2.getScore())
return 1;
else {
if (o1.getAge() > o2.getAge())
return 1;
else if (o1.getAge() < o2.getAge())
return -1;
else
return 0;
}
}

}


测试类

public class Test {

public static void main(String[] args) {
Student stu[] = { new Student("zhangsan", 20, 90.0f),
new Student("lisi", 22, 90.0f),
new Student("wangwu", 20, 99.0f),
new Student("sunliu", 22, 100.0f) };
java.util.Arrays.sort(stu, new StudentComparator());
for (Student s : stu) {
System.out.println(s);
}
}

}


结果跟上面的一样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: