赞
踩
Java的sort方法就是排序,而且排的是升序,你要想降序可以先获得升序的,然后倒过来或者你重新写比较器Comparator的接口就可以。
一 sort 排序方法本身
这里讲的sort方法,都是以Arrays类里面的方法为准,因为很多类的sort方法都是引用的Arrays类的方法,有的就是加一个比较器作为参数就完事了,比如说ArrayList的sort方法。
以下是ArrayList的排序方法
@Override
@SuppressWarnings("unchecked")
public void sort(Comparator<? super E> c) {
final int expectedModCount = modCount;
Arrays.sort((E[]) elementData, 0, size, c);
if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
modCount++;
}
二 关于sort采用什么排序方法
排序方法直接影响着排序的效率,但实际上sort方法排序方式不一定是固定的,可能根据调用的方法,或者是输入的数量大小(小的直接插入,大的归并之类的)。
以下是Arrays类的sort方法,光sort方法就很多个
(这里还要提一下parallelsort排序,就是并行排序,同样他和sort方法比较快慢,也要分情况可以根据这个公式:
parallelSort() = sort() / 核心数 + 聚合时间
来区分不仅要看采用的排序策略占用的时间,还要看本地主机的,本地主机单核心的话,实际上使用不使用ParallelSort都没啥必要
)
这里主要我们讨论的是sort常用的DualPivotQuicksort.sort方法,以下是DualPivotQuicksort不同数据量的数据才去的排序策略,这里面还会涉及到轴的选择
三 自定义比较器
自定义比较器Comparator,除了倒序之类的,可以自己添加定义,比如说你创建一个学生Student的类,你现在有一个List的列表你现在要根据里面的学生成绩来排序
例如:实际上就是定义了一个比较器,或者说重新实现了Comparator的接口
//降序排序 Student studentWang = new Student("王小二", 10); Student studentZhang = new Student("张三", 1); Student studentGou = new Student("狗子", 99); Student studentZhao = new Student("赵六", 40); Student studentLi = new Student("李四", null); List<Student> students = new ArrayList<Student>(Arrays.asList(studentWang, studentZhang, studentGou, studentZhao, studentLi)); Collections.sort(students, new Comparator<Student>() { public int compare(Student o1, Student o2) { if(null == o1.getAge()) { return 1; } if(null == o2.getAge()) { return -1; } return o2.getAge().compareTo(o1.getAge()); } }); System.out.println("自定义对象,降序排序:"); for(Student student : students) { System.out.println(student.toString()); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。