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+" "+age+" "+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 + " " + age + " " + 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); } } }
结果跟上面的一样。