`
thrillerzw
  • 浏览: 143927 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Comparable与 Comparator,源码分析Collections.sort

    博客分类:
  • java
 
阅读更多

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;
}

 

0
0
分享到:
评论

相关推荐

    java List 排序 Collections.sort

    在Java编程中,`List`接口是集合框架的重要组成部分,提供了有序的元素存储。...通过阅读和理解`Collections.sort()`的源码,开发者可以进一步提升自己的技能,同时也能更好地理解和运用其他Java集合框架的方法。

    java中Collections.sort排序详解

    Java中Collections.sort排序详解 Java中的Collections.sort排序是Java.util....通过示例代码,展示了如何使用Collections.sort()方法对列表进行排序,并定义了一个Comparator接口的实现类来比较书籍的价格。

    Java Collections.sort()实现List排序的默认方法和自定义方法

    在使用Collections.sort()方法时,需要注意的是,元素的类型必须实现Comparable接口,并且重写compareTo()方法,以便对元素进行比较排序。如果元素类型没有实现Comparable接口,将抛出ClassCastException异常。 ...

    JAVA对list集合进行排序Collections.sort()

    Collections.sort(list, new Comparator() { public int compare(ResultTypeDesc o1, ResultTypeDesc o2) { return o2.getRatio().compareTo(o1.getRatio()); } }); ``` 这里,`compare()` 方法的实现决定了排序...

    java中Comparable和Comparator的区别

    在Java编程语言中,Comparable和Comparator接口是两个重要的概念,它们都用于对象的排序,但有着不同的使用...在源码分析和工具开发中,了解这些基础概念能帮助我们更好地设计和优化代码,提高程序的可读性和可维护性。

    java中Collections.sort排序函数用法详解

    `Collections.sort()` 可以根据元素的自然顺序或者自定义的比较器(Comparator)进行排序。 ### 1. 自然顺序排序 如果列表中的元素实现了 `Comparable` 接口,那么 `Collections.sort()` 会使用元素的自然顺序进行...

    详解Java中Collections.sort排序

    `Collections.sort()`有两种主要的排序方式:一种是基于元素的自然顺序,另一种是通过自定义比较器`Comparator`。 首先,我们来详细讲解`Collections.sort()`的默认排序机制。当传入的列表元素实现了`Comparable`...

    详解java Collections.sort的两种用法

    Collections.sort 方法的第一个参数形式是 public static &lt;T extends Comparable&lt;? super T&gt;&gt; void sort(List&lt;T&gt; list),该方法对 List 中的基本类型元素进行排序。下面是一个使用基本类型(Integer)来演示的示例...

    用Java集合中的Collections.sort方法如何对list排序(两种方法)

    第二种方法是使用Collections.sort方法的重载形式,传入一个Comparator对象。Comparator接口提供了自定义排序规则的灵活性,即使类本身没有实现Comparable接口也可以进行排序。在示例中,我们创建了一个匿名内部类,...

    listview按序排列显示

    Collections.sort(entries, new Comparator&lt;Map.Entry, String&gt;&gt;() { @Override public int compare(Map.Entry, String&gt; o1, Map.Entry, String&gt; o2) { return o1.getKey().compareTo(o2.getKey()); } }); ``` ...

    Comparable与Comparator的区别

    在Java编程语言中,Comparable和Comparator是两个非常重要的接口,它们都用于对象的比较和排序。下面是关于这两个接口的详细解释: **Comparable接口** Comparable接口位于`java.lang`包下,它是一个对象自比较的...

    Comparable和Comparator区分1

    【Comparable和Comparator区分详解】 Comparable接口是Java中用于对象排序的关键接口,主要应用于需要自动排序的场景。当一个类实现了Comparable接口,意味着该类的对象具备内在的比较逻辑,可以直接进行比较。例如...

    Comparable与Comparator的区别Java开

    当类的实例实现`Comparable`接口时,它们可以被直接传递给`Collections.sort()`或`Arrays.sort()`方法进行排序。 `compareTo()`方法的签名如下: ```java int compareTo(T o); ``` 这里,`T`是类型参数,表示与当前...

    java排序Comparator和Comparable

    在实际开发中,`Comparable`常用于定义类的自然排序逻辑,而`Comparator`则更多地用于定制排序或者在多线程环境中,避免修改原始类的源码。 总结一下,`Comparable`和`Comparator`都是Java中实现排序的重要手段。`...

    Java中Comparable和Comparator的区别

    例如,当我们有一个自定义类的集合,并且需要按照多种方式进行排序时,可以先让类实现Comparable接口,表示其默认的排序规则,然后在需要其他排序规则时,创建Comparator实例并传递给Collections.sort()或者TreeSet...

    java的Comparator和Comparable.docx

    当一个类实现了 Comparable 接口,那么该类的对象就可以直接调用 Collections.sort 或 Arrays.sort 进行排序。 例如,User 类原本没有排序功能,但当我们让它实现 Comparable&lt;User&gt; 接口后,就可以为 User 对象添加...

    comparator接口与Comparable接口的区别

    Comparator接口与Comparable接口的区别 Comparator接口与Comparable接口是Java语言中两个重要的接口,它们都是用于比较和排序自定义类的对象的大小的。虽然它们两个都是用于比较的接口,但是它们有着不同的实现方式...

    Java中Comparable和Comparator 2种实现方式学习

    在实际编程中,`Comparator`常用于集合框架的排序方法,如`Collections.sort()`或`TreeSet`的构造函数。通过传入自定义的`Comparator`实例,我们可以改变默认的排序逻辑。 总的来说,`Comparable`和`Comparator`都...

Global site tag (gtag.js) - Google Analytics