c语言一维数组怎么快速排列
217
2023-06-03
Java Comparable和Comparator对比详解
在实际项目开发过程中,我们经常需要对某个对象或者某个集合中的元素进行排序,常用的两种方式是实现某个接口。常见的可以实现比较功能的接口有Comparable接口和 Comparator接口,那么这两个又有什么区别呢?
关于Comparable接口
关于Comparable接口,其位于 java.lang.Comparable 中,实现这个接口,可以通过重写其 compareTo 方法进行自定义排序,一般用于实体类中,比如针对学生对象,根据其姓名、身高、年龄、地址等进行排序,商品根据名称、库存、价格排序等。下面一段代码中主要是对 学生的姓名、年龄、地址进行排序,当我们重写其 compareTo 方法后,对于一个学生对象的集合,我们可以通过调用 Collections.sort(studentList) 对其进行排序,即可达到想要的效果。
public class Students implements Comparable
private String name;
private int age;
private String address;
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 String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("姓名:").append(this.name);
sb.append("年龄:").append(this.age);
sb.append("地址:").append(this.address);
return sb.toString();
}
// 重写排序方法,先根据年龄升序,再根据姓名降序,最后根据地址升序
@Override
public int compareTo(Students o) {
int result= 0;
result = this.age - o.getAge();
if (0 == result){
result = o.getName().compareTo(this.getName());
if (0 == result){
result = this.getAddress().compareTo(o.getAddress());
}
}
return result;
}
}
关于Comparator接口
关于Comparator接口,其位于 java.util.Comparator 中,http://实现这个接口,可以通过重写其 compare 方法进行自定义的排序,比如针对 字符串的 lishttp://t,根据其长度递减排序;根据Integer 的集合,根据其大小升序(Collections.sort()方法中默认实现的就是升序)。此外,针对数组的排序,还可以调用 Arrays.sort() 进行排序,其默认是根据字典顺序进行排序。
import java.util.*;
public class CompareController1 implements Comparator
@Override
public int compare(Integer o1, Integer o2) {
// int length1 = o1.length();
// int length2 = o2.length();
return o2 - o1; //按照降序排列
}
public static void main(String[] args) {
List
list.add(1);
list.add(23);
list.add(400);
list.add(222);
list.add(34);
Collections.sort(list,new CompareController1());
System.out.println(list.toString());
Object[] objects = list.toArray();
// 针对String类型,默认是按照字典表进行排序
// 针对 int 类型,默认是 按照 升序 进行排序
Arrays.sort(objects);
//不能直接打印数组,那样打印出来的是地址,可以使用 foreach
System.out.println(Arrays.toString(objects));
}
}
扩展补充:
关于Collections.sort()和 Arrays.sort()
1) Collections.sort()方法底层实际就是Arrays.sort(),
2) Arrays.sort()的底层分为两种,满足某种条件就调用这个排序 legacyMergeSort,其底层就是归并排序;如果不满足,就是 TimSort
3) TimSort 的底层根据数组的长度进行区分,如果数组的长度小于32,直接使用简单的合并算法,即二分插入排序(binary merge sort);如果长度大于32,就是 合并算法。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~