2012-08-09 2 views
2

Java에서 Generics 사용법에 익숙합니다.Collections 유틸리티 클래스의 정렬 함수 구현 비교

  1. 원시ListIteratorComparable에 왜 기반의 정렬 기능의 매개 변수 ListIterator입니다 :

    // Sorting based on Comparable 
    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]); 
        } 
    } 
    
    
    // Sorting based on Comparator 
    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]); 
        } 
    } 
    

    내가 이해하려는 것은 Collections.java 클래스의 정렬 기능을 다음과 우연히 만났다 Comparator을 기준으로 정렬 기능에 사용됩니까?

  2. Comparable에 따라 분류 기능 필요 (T에) 캐스팅 유형입니다 왜 for 루프에서

    왜 캐스팅 Comparator에 따라 분류 기능의 for 루프에서 필요하지 않습니다?

나는 다음과 같은 코드가 비교 기반의 정렬 기능보다 형식이 안전 할 것이다 느낌 :

원시 반복자는 비교기에 따라 정렬 기능에 사용되는 이유
public static <T> void Sort(List<T> list, Comparator<? super T> c) { 
     Object[] a = list.toArray(); 
     Arrays.sort(a, (Comparator)c); 
     ListIterator<T> i = list.listIterator(); 
     for (int j=0; j<a.length; j++) { 
      i.next(); 
      i.set((T)a[j]); 
     } 
} 

답변

3

.

? super T[] 배열을 만들 수 없으므로 대신 Object[]을 만들고 거기에서 원시 형식을 사용합니다. Comparable를 기반으로 정렬 기능에 필요하고 (T로) 주조 유형 이유 for 루프에서

캐스팅 첫 번째 경우에서 비교기

에 따라 분류 기능의 루프에서 필요없는 이유 ListIterator<T>set(T)이고 두 번째 경우는 ListIterator이며 모든 개체를 설정할 수 있습니다.

+0

입력 목록의 매개 변수가 지정되면 두 번째 대/소문자에 개체를 설정할 수 있도록 허용하는 것이 실수가 아닙니까? – user1586907

+0

유형을 이미 매개 변수로 확인하지 않은 경우입니다. –

+0

좋아, 사물을 명확히 해준 Peter. – user1586907

관련 문제