【Java】java中的compareTo和compare的区别
2024-08-25 07:48:53
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);
}
} }
结果跟上面的一样。
最新文章
- java多线程synchronized底层实现
- Oracle connect by 树查询之二
- 20135202闫佳歆--week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程--实验及总结
- SQL Server 2008 R2导出数据脚本的方法
- [置顶] Jquery学习总结(二) jquery选择器详解
- HTTP Status 404 - No result defined for action com.hebky.oa.classEntity.action.EntitysAction and result input
- Ubuntu 14.04 使用MyEclipse 10.7 闪退解决
- Struts2运行流程-源码剖析
- 习题 7-3 uva211
- python3环境搭建(uWSGI+django+nginx+python+MySQL)
- Failed to load ApplicationContext ,Error creating bean with name &#39;adminUserService&#39;: Injection of autowired dependencies failed;
- redis(4.0.11)编译安装
- ___Jquery多选框的取值及反显数据
- 国外青少年最喜爱的聊天 app,竟然是 Google Docs
- spring使用BeanPostProcesor实现AOP源码分析
- Linux实践一:问题及解决
- js中var a=new Object()和var a={}有什么区别吗?
- 解码url参数的lotusscript函数
- 很全的linux网络编程技巧
- 线段树---poj2528 Mayor’s posters【成段替换|离散化】
热门文章
- 异常:org.springframework.http.converter.HttpMessageNotReadableException
- C++ 中的 new/delete 和 new[]/delete[]
- Linux添加路由
- chrome瀏覽器去掉緩存的方法
- 1078 Hashing
- php爬虫神器cURL
- oracle 11g r2 使用rman进行迁移rac到rac
- CGI/MIME/servlet术语解释
- python学习(十一) 文件和流
- Linux批量“解压”JAR文件