Collectionsのsortメソッドのソート

8453 ワード

CollectionのsortメソッドでListをソートするには、次の2つの方法があります.
1.List内のオブジェクトはComparableインタフェースを継承し、そのcompareToメソッドを実装する
  //比較対象クラスPersonH
[java] view plain copy print ?
public class PersonH implements Comparable  
  • {  

  •   
  •       

  •     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());         
  •     }   

  • }  
    public class PersonH implements Comparable
    {
    
    	
    	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クラステスト
    [java] view plain copy print ?
    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 personList = new ArrayList();  

  •           
  •         personList.add(person);  

  •         personList.add(person2);  
  •         personList.add(person3);  

  •           
  •         Collections.sort(personList);//ソート  

  •         for(PersonH personH : personList) //ソート結果の出力  
  •         {  

  •             System.out.println(personH.getLevel());  
  •         }  

  •     }  
  •   

  • }  
    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 personList = new ArrayList();
    		
    		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リロードにより、//P e rsonHクラスを実現
    [java] view plain copy print ?
    public class PersonH   
  • {  

  •   
  •       

  •     private int level;  
  •       

  •     public Integer getLevel()  
  •     {  

  •         return level;  
  •     }  

  •     public void setLevel(Integer level1)  
  •     {  

  •         this.level = level1;  
  •     }     

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

    //Mainクラス
    [java] view plain copy print ?
    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 personList = new ArrayList();  

  •           
  •         personList.add(person);  

  •         personList.add(person2);  
  •         personList.add(person3);  

  •         //ここで、比較ポリシーをより柔軟に指定することができ、第1の実装方法は、比較対象のクラスに比較ポリシーを固定することである.  
  •      Collections.sort(personList,new Comparator()  

  •         {  
  •             public int compare(PersonH p1,PersonH p2)  

  •             {  
  •              return p1.getLevel().compareTo(p2.getLevel());

  •             }  
  •         });

  •         for(PersonH personH : personList)  
  •         {  

  •             System.out.println(personH.getLevel());  
  •         }  

  •     }  
  •   

  • }  
    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 personList = new ArrayList();
    		
    		personList.add(person);
    		personList.add(person2);
    		personList.add(person3);
    		//               ,                         。
    		Collections.sort(personList,new Comparator()
    		{
    			public int compare(PersonH p1,PersonH p2)
    			{
    				return p1.getLevel().compareTo(p2.getLevel());
    			}
    		});
    		for(PersonH personH : personList)
    		{
    			System.out.println(personH.getLevel());
    		}
    	}
    
    }
    

    次に、この方法がどのようにソートされているかを見てみましょう.
    1つ目の場合:
    [java] view plain copy print ?
    public static extends Comparable super T>> void sort(List list) {  
  •     Object[] a = list.toArray();  

  •    Arrays.sort(a);  
  •     ListIterator i = list.listIterator();  

  •     for (int j=0; j
  •         i.next();  

  •         i.set((T)a[j]);  
  •     }  

  •     }  
    public static > void sort(List list) {
        Object[] a = list.toArray();
        Arrays.sort(a);
        ListIterator i = list.listIterator();
        for (int j=0; j

    [java] view plain copy print ?
    public static void sort(Object[] a) {  
  •        Object[] aux = (Object[])a.clone();  

  •        mergeSort(aux, a, 0, a.length, 0);  
  •    }  
  •  public static void sort(Object[] a) {
            Object[] aux = (Object[])a.clone();
            mergeSort(aux, a, 0, a.length, 0);
        }
    は、直接呼び出し集計ソートによって行われたことを示すことができる.
    2つ目の場合:
    [java] view plain copy print ?
    public static  void sort(List list, Comparator super T> c) {  
  •     Object[] a = list.toArray();  

  •    Arrays.sort(a, (Comparator)c);
  •     ListIterator i = list.listIterator();  

  •     for (int j=0; j
  •         i.next();  

  •         i.set(a[j]);  
  •     }  

  •     }  
    public static  void sort(List list, Comparator super T> c) {
        Object[] a = list.toArray();
        Arrays.sort(a, (Comparator)c);
        ListIterator i = list.listIterator();
        for (int j=0; j

    [java] view plain copy print ?
    public static  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);

  •     }  
    public static  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クラスを参照できます.