2011-12-26 3 views
2

나는 초보자이며 주어진 코드를 이해하기 위해 노력하고있다. here.자바에서 비교기 구현

내가 이해하지 못하는 것은 StringLengthComparator 클래스에서 두 객체를 비교하는 "skeleton"을 구성한다는 것입니다. String o1, String o2.

그러나 클래스를 적용하면 6 개의 문자열이 StringLengthComparator에 전달되어 올바른 결과를 얻습니다.

제 질문은 클래스에서 단지 2 개의 개체를 비교할 때 어떻게 생깁니 까?하지만 6 개의 문자열이 전달되면 올바른 결과가 나타납니다.

분명히 나는 ​​여기에 근본적인 것이 빠져 있기 때문에 이것에 대한 지침은 훌륭 할 것입니다.

+0

http://docs.oracle.com/javase/tutorial/collections/algorithms/index.html을 참조하십시오. – adatapost

답변

1

제 질문은 클래스에서 단지 2 개의 개체를 비교할 때 어떻게 생깁니 까?하지만 6 개의 문자열이 전달되면 올바른 결과가 나타납니다.

객체의 메소드 .compare 번 두 문자열을 비교한다. Arrays.sort 메서드는 제공된 객체 번에 .compare을 몇 번 호출하여 번을 호출하고 결과 집합 정보를 사용하여 6 개의 전체 집합과 다른 문자열 쌍을 전달하여 배열을 정렬합니다.

+0

놀라움 : 정확히 내가 아는 설명입니다. 나는 matlab/python 배경에서 왔습니다. 그래서 이것은 저에게 새로운 것입니다. 다시 많은 감사드립니다. – JasonB

+0

... Matlab을 말할 수는 없지만 파이썬에서는 ** 같은 방식으로 작동합니다 **. 자바의'Arrays.sort'는 파이썬의'list' 객체에 대한'sort' 메소드와 유사합니다. Comparator 객체는 해당 메소드에 대한 (현재는 사용되지 않는)'cmp' 키워드 인수에 전달 된 호출 가능 객체와 유사합니다. 그러나 Java에는'__call__'과 같은 것이 없으므로 특정 명명 된 함수가 대신 사용됩니다 (이름은 'Comparator' 인터페이스에 의해 사용됩니다). –

0

혼란 스러워요. 그것은 실제로 "해골"이 아니며 단순히 한 것과 다른 것 사이의 관계를 결정하는 알고리즘입니다. 따라서 정렬은이 관계를 결정할 때 비교자를 호출합니다. 예를 들어 콤퍼레이터에서 관계를 거꾸로 만들어서 내림차순 정렬을 얻을 수 있습니다.

2

길이 또는 알파벳 순서 등의 정렬 매개 변수를 지정하는 데 사용되는 비교기 (java의 컬렉션에 사용)입니다. 기본적으로 문자열의 알파벳순으로 비교하므로 두 문자열을 길이별로 비교하려면 Comparator를 오버라이드 (override) 해 길이를 비교합니다.

Arrays.sort(strs, new StringLengthComparator()); 

은을 비교 한 매개 변수 문자열의 길이 것이라고 말한다 비교기 StringLengthComparator 지정으로 배열 strs의 각 요소에 대하여 문자열의 배열을 정렬한다.

0

기본적으로, 스트링의 배열 (6 문자열) 배열 궁극적

0

하나하여 문자열을 하나씩 비교하고 정렬 할 StringLengthComparator를 사용하는 Arrays.sort에뿐만 StringLengthComparator에 전달되지 않고, 이는 Arrays.sort가 어떻게 구현. look at the Java 6 API을 사용할 수 있지만 자신이 직접 source code을 볼 때까지는 만족스럽지 않을 것입니다. 소스 코드 디렉토리에서 /jdk/src/share/classes/java/util/Arrays.java 파일을 확인하십시오.

이 방법은 배열을 가져 와서 Comparator를 실행 한 다음 해당 Comparator를 사용하여 전체 배열에 병합 정렬 버전을 실행하는 것입니다. 이 방법의 특성을 완전히 파악하기 위해 mergesort을 살펴 본다면 잘 대처할 수 있습니다.

Java 6/7이 오픈 소스이기 때문에 다음은 코드 스 니펫입니다. 다시 한번, mergesort를 살펴보면 왜 이것이 작동 하는지를 알 수 있습니다.


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

자바의 내부 정렬 알고리즘 (또는 그 문제에 대한 모든 정렬 알고리즘은) 프리미티브가 아닌 다른 개체를 정렬하는 방법을 알 필요가있다.

예를 들어, Java는 integers의 배열을 정렬하는 방법을 알고 있습니다. 자연 순서가 설정 되었기 때문입니다. [정수 (a, b)의 시퀀스에 대해 a가 b보다 작 으면 b가 앞에 올 것임] 이는 사용자가 만들 수있는 모든 객체에 해당하지는 않습니다. 그래서이 객체들을 위해서 자바를 정렬하는 법을 알게하고 Comparator.compare()이이 목적을 위해 사용됩니다.

어떤 정렬 알고리즘은 동일한 유형의 단지 two 객체를 비교하는 방법을 알 필요가로서 당신은 StringLengthComparator 같은 것을 만들 때, 두 개의 매개 변수가 Comparator.compare()

1

에 대한 충분한이며, 당신이 개발자가 구현 :

int compare(T o1, T o2) 

메서드 Comparator 인터페이스를 구현하기위한 계약의 일부로. 두 개의 T 개체가있는 경우이 메서드는 o1이 각각 o2보다 크거나 같거나 작은 경우에 따라 1, 0 또는 -1을 반환합니다.

올바르게 구현하는 경우,이 정렬 알고리즘 어떤에 대한 유일한 요구 사항은 일반적으로 mergesort, quicksort, 또는 정렬 다른 어떤 루틴이의 그 생각 할 수 있는지 여부, 코드에 연결되어야한다.

static void sort(Object[] a, Comparator c) 

당신이 더 의심이있는 경우 JDK 소스를 다운로드하고 어떻게하는지 참조 :

Arrays 클래스는 호출 할 때이 속성을 사용합니다. 연습으로 비교자를 취하고 배열을 사용하여 배열을 정렬하는 알고리즘 BubbleSort과 같은 것을 작성해야합니다.