Collections的sort方法

經過Collections的sort方法對List進行排序,有兩種方法實現:java

  1. List<T>中的對象應實現Comparable接口,並實現其compareTo方法ide

    //須要比較的對象類PersonH函數

public class PersonH implements Comparable<PersonH>
{

	private int level;
	
	public Integer getLevel()
	{
		return level;
	}
	public void setLevel(Integer level1)
	{
		this.level = level1;
	}
	@Override
	public int compareTo(PersonH o)
	{
	  return this.getLevel().compareTo(o.getLevel());		
	}	
}

//Main類this

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		PersonH person  = new PersonH();
		person.setLevel(6);
		PersonH person2 = new PersonH();
		person2.setLevel(8);
		PersonH person3 = new PersonH();
		person3.setLevel(3);
		List<PersonH> personList = new ArrayList<PersonH>();
		
		personList.add(person);
		personList.add(person2);
		personList.add(person3);
		
		Collections.sort(personList);//排序
		for(PersonH personH : personList) //輸出排序後結果
		{
			System.out.print(personH.getLevel() + "\t");
		}
	}

}

//運行結果:3 6 8spa

這種方式至關於類PersonH具有了指定的基本排序策略,因它實現了compareTo方法code

2. 根據Collections.sort重載之,來實現對象

//PersonH類排序

public class PersonH 
{
	private int level;
	
	public Integer getLevel()
	{
		return level;
	}
	public void setLevel(Integer level1)
	{
		this.level = level1;
	}	
}

//Main類接口

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

public class Main
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		PersonH person  = new PersonH();
		person.setLevel(6);
		PersonH person2 = new PersonH();
		person2.setLevel(8);
		PersonH person3 = new PersonH();
		person3.setLevel(3);
		ArrayList<PersonH> personList = new ArrayList<PersonH>();
		
		personList.add(person);
		personList.add(person2);
		personList.add(person3);
		//這裏能夠更加靈活地指定比較策略,第一種實現方法是在要比較對象的類中就固定了比較策略。
		Collections.sort(personList,new Comparator<PersonH>()
		{
			public int compare(PersonH p1,PersonH p2)
			{
				return p1.getLevel().compareTo(p2.getLevel());
			}
		});
		for(PersonH personH : personList)
		{
			System.out.print(personH.getLevel() + "\t");
		}
	}

}

//運行結果:3 6 8rem

下面看一下該方法是如何進行排序的:

對於第一種:

    public static <T extends Comparable<? super T>> void sort(List<T> list) {
        Object[] a = list.toArray();
        Arrays.sort(a);
        ListIterator<T> i = list.listIterator();
        for (int j=0; j<a.length; j++) {
            i.next();
            i.set((T)a[j]);
        }
    }
    public static void sort(Object[] a) {
        if (LegacyMergeSort.userRequested)
            legacyMergeSort(a);
        else
            ComparableTimSort.sort(a);
    }
    /** To be removed in a future release. */
    private static void legacyMergeSort(Object[] a) {
        Object[] aux = a.clone();
        mergeSort(aux, a, 0, a.length, 0);
    }

對於第二種:

    public static <T> void sort(List<T> list, Comparator<? super T> c) {
        Object[] a = list.toArray();
        Arrays.sort(a, (Comparator)c);
        ListIterator i = list.listIterator();
        for (int j=0; j<a.length; j++) {
            i.next();
            i.set(a[j]);
        }
    }
    public static <T> void sort(T[] a, Comparator<? super T> c) {
        if (LegacyMergeSort.userRequested)
            legacyMergeSort(a, c);
        else
            TimSort.sort(a, c);
    }

    /** To be removed in a future release. */
    private static <T> void legacyMergeSort(T[] a, Comparator<? super T> c) {
        T[] aux = a.clone();
        if (c==null)
            mergeSort(aux, a, 0, a.length, 0);
        else
            mergeSort(aux, a, 0, a.length, 0, c);
    }

總之,兩種方式都是經過mergeSort和TimSort實現的。

首先看是否指定排序策略,若是沒有,則和第一種走同樣的邏輯;不然進行指定比較策略的歸併排序。

mergeSort函數的源代碼能夠參考java.util.Arrays類。

相關文章
相關標籤/搜索