您的位置:首页 > 其它

Arraylist<T>等实现自定义的排序算法

2017-09-18 20:24 295 查看
考试的时候,本想到Arraylist可以自定义排序算法,可是忘记了返回值(当时看不了源码),后面只能自己写了个冒泡排序(效率太低了),现在说说如何自定义排序算法

import java.util.ArrayList;
import java.util.Comparator;

public class test {

public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Teacher>data= new ArrayList<Teacher>();
data.add(new Teacher("aaa", 3));
data.add(new Teacher("bbb", 1));
for(int i=0;i<data.size();i++){
System.out.println("老师名字为: "+data.get(i).name+"  老师的ID为: "+data.get(i).id);
}
data.sort(new Comparator<Teacher>() {
@Override
public int compare(Teacher o1, Teacher o2) {
// TODO Auto-generated method stub
if(o1.id>o2.id)return 1;
//从大到小排列! 1代表需要排列
else return -1;
}
});
for(int i=0;i<data.size();i++){
System.out.println("老师名字为: "+data.get(i).name+"  老师的ID为: "+data.get(i).id);
}
}
}
class Teacher{
public String name;
public int id;
public Teacher(String name,int id){
this.name=name;
this.id=id;
}
}


最后的运行结果为



我在考试时一直以为0 和1 ,看来源码后发现是<0 这个判断条件,Comparator里面就是自己自定义的排序,从大到小还是从小到大,

下面是Arratlist.sort()采用的算法源码:

@SuppressWarnings("fallthrough")
private static <T> void binarySort(T[] a, int lo, int hi, int start,
Comparator<? super T> c) {
assert lo <= start && start <= hi;
if (start == lo)
start++;
for ( ; start < hi; start++) {
T pivot = a[start];

// Set left (and right) to the index where a[start] (pivot) belongs
int left = lo;
int right = start;
assert left <= right;
/*
* Invariants:
*   pivot >= all in [lo, left).
*   pivot <  all in [right, start).
*/
while (left < right) {
int mid = (left + right) >>> 1;
if (c.compare(pivot, a[mid]) < 0)
right = mid;
else
left = mid + 1;
}
assert left == right;
int n = start - left;  // The number of elements to move
// Switch is just an optimization for arraycopy in default case
switch (n) {
case 2:  a[left + 2] = a[left + 1];
case 1:  a[left + 1] = a[left];
break;
default: System.arraycopy(a, left, a, left + 1, n);
}
a[left] = pivot;
}
}


其实就是快速排序算法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  arraylist 源码