Collections的sort方法 排序

通过Collection的sort方法对List进行排序,有两种方法实现:

1. List<T>中的对象应继承Comparable接口,并实现其compareTo方法

   //需要比较的对象类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)
	{
		// TODO Auto-generated method stub
	  return this.getLevel().compareTo(o.getLevel());		
	}	
}
  //Main类测试
public class Main
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		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);//排序
		for(PersonH personH : personList) //输出排序后结果
		{
			System.out.println(personH.getLevel());
		}
	}

}
这中方式相当与类personH具备了指定的基本排序策略,因它实现了compareTo方法

2. 根据Collection.sort重载之,来实现
//PersonH类

public class PersonH 
{

	
	private int level;
	
	public Integer getLevel()
	{
		return level;
	}
	public void setLevel(Integer level1)
	{
		this.level = level1;
	}	
}
//Main类

public class Main
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		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.println(personH.getLevel());
		}
	}

}

下面看一下该方法是如何进行排序的:

对于第一种:

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) {
        Object[] aux = (Object[])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) {
	T[] aux = (T[])a.clone();
        if (c==null)
            mergeSort(aux, a, 0, a.length, 0);
        else
            mergeSort(aux, a, 0, a.length, 0, c);
    }
总之,两种方式都是通过mergeSort实现的。

首先看是否指定排序策略,如果没有,则和第一种走一样的逻辑;否则进行指定比较策略的归并排序。

mergeSort函数的源代码可以参考java.util.Arrays类。
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页