1、Comparable
对象实现Comparable<T>接口,对象调用compareTo与另一个对象进行比较。
//jdk1.6接口 public interface Comparable<T> { //Compares this object with the specified object for order. public int compareTo(T o); } //例子 public class Lexeme implements Comparable<Lexeme>{ /* * 词元在排序集合中的比较算法 * @see java.lang.Comparable#compareTo(java.lang.Object) */ public int compareTo(Lexeme other) { //起始位置优先 if(this.begin < other.getBegin()){ return -1; }else if(this.begin == other.getBegin()){ //词元长度优先 if(this.length > other.getLength()){ return -1; }else if(this.length == other.getLength()){ return 0; }else {//this.length < other.getLength() return 1; } }else{//this.begin > other.getBegin() return 1; } } 。。。 } //调用 if(this.tail.compareTo(newCell) == 0){ 。。。 } //>0 <0
2、Comparator
list对象排序,Collections.sort调用。 public static <T> void sort(List<T> list, Comparator<? super T> c)
public interface Comparator<T> { // Compares its two arguments for order. int compare(T o1, T o2); boolean equals(Object obj); } /** * * @Description: hashmap根据值得长度降序排列 * 思路:将hashmap转为list,用Collections.sort 配合 比较器对list排序 * @author thrillerzw * @create time 2014-4-17 */ static void hashMapSort() { Map<String, String> map = new HashMap<String, String>(); map.put("a", "11"); map.put("c", "1"); map.put("b", "111"); //通过ArrayList构造函数把map.entrySet()转换成list Set<Map.Entry<String, String>> set = map.entrySet(); List<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(set); Collections.sort(list, new Comparator<Map.Entry<String, String>>() { public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) { if (o1.getValue().length() >= o2.getValue().length()) { return -1; } else { return 1; } //按key排序,字符串compareTo比较 res=0、 res=1 、res=-1; // int res=o1.getKey().compareTo(o2.getKey()); // return res; } }); //排序后,使用排好序的list System.out.println(list); }
3、Collections.sort自定义Comparator源码分析
public static <T> void sort(List<T> list, Comparator<? super T> c) { Object[] a = list.toArray(); //对数组排序,执行完后:[h=1111111, g=11111, e=11111, b=111, k=111, f=11, a=11, c=1] Arrays.sort(a, (Comparator)c); ListIterator i = list.listIterator(); for (int j=0; j<a.length; j++) { //修改了lastRet的值,作为set(int index, E element)的index输入 i.next(); //位置用lastRet的值 i.set(a[j]); } } // Arrays.sort(a, (Comparator)c);调用 private static void mergeSort(Object[] src, Object[] dest, int low, int high, int off, Comparator c) { int length = high - low; // Insertion sort on smallest arrays //长度小于7,冒泡排序 if (length < INSERTIONSORT_THRESHOLD) { for (int i=low; i<high; i++) //调用自定义的compare方法比较。i=1时,1和0比较。i=2时,2和1、1和0比较.... for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--) //compare结果>0时,交换数组元素 swap(dest, j, j-1); return; } // Recursively sort halves of dest into src int destLow = low; int destHigh = high; low += off; high += off; //mid=4 int mid = (low + high) >>> 1; //递归前半部分0--4 mergeSort(dest, src, low, mid, -off, c); ////递归后半部分4--8 mergeSort(dest, src, mid, high, -off, c); // If list is already sorted, just copy from src to dest. This is an // optimization that results in faster sorts for nearly ordered lists. if (c.compare(src[mid-1], src[mid]) <= 0) { System.arraycopy(src, low, dest, destLow, length); return; } //src :[g=11111, e=11111, b=111, f=11, h=1111111, k=111, a=11, c=1]的前部分跟后部分比较,结果存入desc //dest:[h=1111111, g=11111, e=11111, b=111, k=111, f=11, a=11, c=1] // Merge sorted halves (now in src) into dest for(int i = destLow, p = low, q = mid; i < destHigh; i++) { //开始p=0 q=4 if (q >= high || p < mid && c.compare(src[p], src[q]) <= 0) dest[i] = src[p++]; else dest[i] = src[q++]; } } /** * Swaps x[a] with x[b]. */ private static void swap(Object[] x, int a, int b) { Object t = x[a]; x[a] = x[b]; x[b] = t; } /* 前后半部分排序长度小于7排序 src 0--4 [f=11, g=11111, e=11111, b=111, c=1, a=11, k=111, h=1111111] [g=11111,f=11, e=11111, b=111, c=1, a=11, k=111, h=1111111] [g=11111, e=11111, f=11, b=111, c=1, a=11, k=111, h=1111111] [g=11111, e=11111, b=111, f=11, c=1, a=11, k=111, h=1111111] 4-8 [g=11111, e=11111, b=111, f=11, h=1111111, k=111, a=11, c=1] dest [h=1111111, g=11111, e=11111, b=111, c=1, a=11, k=111, h=1111111] 前后半部分归并后: src :[g=11111, e=11111, b=111, f=11, h=1111111, k=111, a=11, c=1] dest:[h=1111111, g=11111, e=11111, b=111, k=111, f=11, a=11, c=1] */ //i.next() public E next() { checkForComodification(); try { E next = get(cursor); //修改了lastRet的值 lastRet = cursor++; return next; } catch (IndexOutOfBoundsException e) { checkForComodification(); throw new NoSuchElementException(); } } //修改ArrayList指定位置值 public E set(int index, E element) { RangeCheck(index); E oldValue = (E) elementData[index]; elementData[index] = element; return oldValue; }
相关推荐
在Java编程中,`List`接口是集合框架的重要组成部分,提供了有序的元素存储。...通过阅读和理解`Collections.sort()`的源码,开发者可以进一步提升自己的技能,同时也能更好地理解和运用其他Java集合框架的方法。
Java中Collections.sort排序详解 Java中的Collections.sort排序是Java.util....通过示例代码,展示了如何使用Collections.sort()方法对列表进行排序,并定义了一个Comparator接口的实现类来比较书籍的价格。
在使用Collections.sort()方法时,需要注意的是,元素的类型必须实现Comparable接口,并且重写compareTo()方法,以便对元素进行比较排序。如果元素类型没有实现Comparable接口,将抛出ClassCastException异常。 ...
Collections.sort(list, new Comparator() { public int compare(ResultTypeDesc o1, ResultTypeDesc o2) { return o2.getRatio().compareTo(o1.getRatio()); } }); ``` 这里,`compare()` 方法的实现决定了排序...
在Java编程语言中,Comparable和Comparator接口是两个重要的概念,它们都用于对象的排序,但有着不同的使用...在源码分析和工具开发中,了解这些基础概念能帮助我们更好地设计和优化代码,提高程序的可读性和可维护性。
`Collections.sort()` 可以根据元素的自然顺序或者自定义的比较器(Comparator)进行排序。 ### 1. 自然顺序排序 如果列表中的元素实现了 `Comparable` 接口,那么 `Collections.sort()` 会使用元素的自然顺序进行...
`Collections.sort()`有两种主要的排序方式:一种是基于元素的自然顺序,另一种是通过自定义比较器`Comparator`。 首先,我们来详细讲解`Collections.sort()`的默认排序机制。当传入的列表元素实现了`Comparable`...
Collections.sort 方法的第一个参数形式是 public static <T extends Comparable<? super T>> void sort(List<T> list),该方法对 List 中的基本类型元素进行排序。下面是一个使用基本类型(Integer)来演示的示例...
第二种方法是使用Collections.sort方法的重载形式,传入一个Comparator对象。Comparator接口提供了自定义排序规则的灵活性,即使类本身没有实现Comparable接口也可以进行排序。在示例中,我们创建了一个匿名内部类,...
Collections.sort(entries, new Comparator<Map.Entry, String>>() { @Override public int compare(Map.Entry, String> o1, Map.Entry, String> o2) { return o1.getKey().compareTo(o2.getKey()); } }); ``` ...
在Java编程语言中,Comparable和Comparator是两个非常重要的接口,它们都用于对象的比较和排序。下面是关于这两个接口的详细解释: **Comparable接口** Comparable接口位于`java.lang`包下,它是一个对象自比较的...
【Comparable和Comparator区分详解】 Comparable接口是Java中用于对象排序的关键接口,主要应用于需要自动排序的场景。当一个类实现了Comparable接口,意味着该类的对象具备内在的比较逻辑,可以直接进行比较。例如...
当类的实例实现`Comparable`接口时,它们可以被直接传递给`Collections.sort()`或`Arrays.sort()`方法进行排序。 `compareTo()`方法的签名如下: ```java int compareTo(T o); ``` 这里,`T`是类型参数,表示与当前...
在实际开发中,`Comparable`常用于定义类的自然排序逻辑,而`Comparator`则更多地用于定制排序或者在多线程环境中,避免修改原始类的源码。 总结一下,`Comparable`和`Comparator`都是Java中实现排序的重要手段。`...
例如,当我们有一个自定义类的集合,并且需要按照多种方式进行排序时,可以先让类实现Comparable接口,表示其默认的排序规则,然后在需要其他排序规则时,创建Comparator实例并传递给Collections.sort()或者TreeSet...
当一个类实现了 Comparable 接口,那么该类的对象就可以直接调用 Collections.sort 或 Arrays.sort 进行排序。 例如,User 类原本没有排序功能,但当我们让它实现 Comparable<User> 接口后,就可以为 User 对象添加...
Comparator接口与Comparable接口的区别 Comparator接口与Comparable接口是Java语言中两个重要的接口,它们都是用于比较和排序自定义类的对象的大小的。虽然它们两个都是用于比较的接口,但是它们有着不同的实现方式...
在实际编程中,`Comparator`常用于集合框架的排序方法,如`Collections.sort()`或`TreeSet`的构造函数。通过传入自定义的`Comparator`实例,我们可以改变默认的排序逻辑。 总的来说,`Comparable`和`Comparator`都...