Arraylist<T>等实现自定义的排序算法
2017-09-18 20:24
295 查看
考试的时候,本想到Arraylist可以自定义排序算法,可是忘记了返回值(当时看不了源码),后面只能自己写了个冒泡排序(效率太低了),现在说说如何自定义排序算法
最后的运行结果为
我在考试时一直以为0 和1 ,看来源码后发现是<0 这个判断条件,Comparator里面就是自己自定义的排序,从大到小还是从小到大,
下面是Arratlist.sort()采用的算法源码:
其实就是快速排序算法。
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; } }
其实就是快速排序算法。
相关文章推荐
- 自定义ORM系列(一)利用attribute实现简单的reader=>entity和reader=>List<entity>映射
- 实现比较器接口IComparable<T>,让自定义类型数组也能排序
- 排序算法终结总结<Java实现>
- 在Bundle中传递自定义的Arraylist<Object>
- Netty之实现自定义简单的编解码器二(MessageToMessageEncoder<CharSequence>和MessageToMessageDecoder<ByteBuf>)
- <数据结构>各种排序算法的实现与总结(一)
- Java 之 List<T> 接口的实现:ArrayList
- Dynamic CRM Report<VB下自定义Function实现业务>
- C# 数组集合 <一>基本概念(Array&ArrayList&List<T>&SortList&LinkList的实现Code)
- 一个ArrayList<Integer>的一个对象,我想在这个集合中添加一个字符串数据,如何实现呢
- Android UI设计之<十>自定义ListView,实现QQ空间阻尼下拉刷新和渐变菜单栏效果
- 给定一个 ArrayList<Integer>的一个对象,实现在这个集合中添加一个字符串
- 排序算法终结总结<Java实现>
- Android UI设计之<五>自定义DrawView组件,实现数字签名效果
- 【代码积累】对ArrayList<TwoTuple<Integer,Double>>对象自定义排序
- 各种排序算法及其java程序实现 &lt;转&gt;
- 在Bundle中传递自定义的Arraylist<Object>
- 如何实现ArrayList<E>泛型的复制
- 深入学习java并发编程:CopyOnWriteArrayList<E>实现
- C++自定义修饰键,实现如<Capslock+J>等组合键的按键映射