합의에 따르면 자바 프로그래밍을 할 때는 기존 클래스 라이브러리를 최대한 활용해야 한다. 물론 정렬 방법이나 프레임워크를 직접 작성할 수도 있지만, JDK보다 더 잘 작성할 수 있는 사람이 얼마나 될까? 기존 클래스를 사용하는 또 다른 이점은 코드를 읽고 유지 관리하기 쉽다는 것입니다. 이 기사에서는 주로 기존 클래스 라이브러리를 사용하여 배열 및 다양한 컬렉션 컨테이너를 정렬하는 방법에 대해 설명합니다. (기사의 일부 예는 "Java Developers Almanac 1.4"에서 가져온 것입니다. )
우선, java.util.Arrays 및 java.util.Collections라는 두 가지 클래스를 알아야 합니다(Collection과의 차이점에 유의하세요). Collection은 컬렉션 프레임워크의 최상위 인터페이스이며 Collections에는 많은 정적 메서드가 포함되어 있습니다. 배열을 정렬하려면 배열을 사용하고 ArraysList, LinkedList 등과 같은 결합된 프레임 컨테이너를 정렬하려면 컬렉션을 사용합니다.
예제에는 import java.util.* 및 기타 쉘 코드(클래스, 정적 메인 메소드 등)를 추가해야 합니다. 첫 번째 예제에서는 모든 코드를 작성하고 다음에서는 예외 없이 생략하겠습니다.
배열 정렬
예를 들어, 정수 배열이 있습니다:
다음과 같이 코드 코드를 복사합니다.
int[] intArray = new int[] {4, 1, 3, -23};
어떻게 정렬하나요? 지금 퀵 정렬 알고리즘을 생각하고 계시나요? 이것이 어떻게 수행되는지 살펴보십시오:
다음과 같이 코드 코드를 복사합니다.
import java.util.*;
공개 클래스 정렬{
공개 정적 무효 메인(문자열[] 인수){
int[] intArray = new int[] {4, 1, 3, -23};
Arrays.sort(intArray);
}
}
이런 방식으로 Arrays의 정적 메소드 sort()를 사용하여 intArray를 오름차순으로 정렬합니다. 이제 배열은 {-23,1,3,4}가 됩니다.
문자 배열인 경우:
다음과 같이 코드 코드를 복사합니다.
String[] strArray = new String[] {"z", "a", "C"};
우리는 다음을 사용합니다:
다음과 같이 코드 코드를 복사합니다.
Arrays.sort(strArray);
정렬 후의 결과는 {C, a, z}이며, sort()는 요소의 자연스러운 순서에 따라 오름차순으로 정렬됩니다. 대소문자를 구분하지 않으려면 다음과 같이 작성할 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
Arrays.sort(strArray, String.CASE_INSENSITIVE_ORDER);
물론 정렬할 배열의 특정 섹션을 지정할 수도 있습니다. 예를 들어 배열의 0-2 부분을 정렬하고(배열 길이가 3보다 크다고 가정) 다른 부분은 변경되지 않은 채로 유지하려는 경우 다음을 사용할 수 있습니다:
다음과 같이 코드 코드를 복사합니다.
Arrays.sort(strArray,0,2);
이런 방식으로 다음 부분에 영향을 주지 않고 처음 세 요소만 정렬합니다.
물론 어떤 사람들은 '내림차순으로 정렬하려면 어떻게 해야 합니까?'라고 생각할 것입니다. 많은 정렬 방법 중 하나의 코드 복사본은 다음과 같습니다.
sort(T[] a, 비교기<? super T> c)
Comparator를 사용하여 역순으로 비교기를 얻을 수 있습니다. 이전 intArray[]를 예로 들어 보겠습니다.
다음과 같이 코드 코드를 복사합니다.
Arrays.sort(intArray,Comparator.reverseOrder());
이런 식으로 우리가 얻는 결과는 {4,3,1,-23}입니다. 원본 코드를 수정하고 싶지 않다면 다음을 사용할 수도 있습니다.
다음과 같이 코드 코드를 복사합니다.
Collections.reverse(Arrays.asList(intArray));
배열의 역순을 구합니다. 결과도 4,3,1,-23}입니다.
이제 상황이 바뀌었습니다. 우리의 배열은 더 이상 원시 데이터 유형(원시 유형)이나 문자열 유형의 배열이 아니라 객체의 배열입니다. 이 배열의 자연적인 순서는 알 수 없으므로 이 클래스에 대한 Comparable 인터페이스를 구현해야 합니다. 예를 들어 Name 클래스가 있습니다.
다음과 같이 코드 코드를 복사합니다.
클래스 이름은 Comparable<Name>{을 구현합니다.
공개 문자열 firstName,lastName;
공개 이름(문자열 이름, 문자열 성){
this.firstName=첫번째이름;
this.lastName=성명;
}
public int CompareTo(Name o) { //인터페이스 구현
int lastCmp=lastName.compareTo(o.lastName);
return (lastCmp!=0?lastCmp:firstName.compareTo(o.firstName));
}
public String toString(){ //출력 테스트에 편리함
return firstName+" "+성명;
}
}
이러한 방식으로 이 객체 배열을 정렬할 때 CompareTo(Name o)에서 구현된 것과 마찬가지로 먼저 lastName을 비교한 다음 firstName을 비교하고 두 객체의 순서를 가져옵니다. 다음 프로그램으로 시도해 볼 수도 있습니다.
다음과 같이 코드 코드를 복사합니다.
import java.util.*;
공개 클래스 NameSort {
공개 정적 무효 메인(String[] args) {
이름 nameArray[] = {
new Name("John", "Lennon"),
new Name("칼", "마르크스"),
new Name("그루초", "마르크스"),
new Name("오스카", "그라우치")
};
Arrays.sort(nameArray);
for(int i=0;i<nameArray.length;i++){
System.out.println(nameArray[i].toString());
}
}
}
결과는 우리가 예상한 대로입니다:
다음과 같이 코드 코드를 복사합니다.
오스카 그루치
존 레논
그루초 막스
칼 마르크스
컬렉션 프레임 정렬
배열을 정렬하는 Arrays.sort()를 이해했다면 컬렉션 프레임워크의 사용도 비슷합니다. 배열을 컬렉션으로 바꾸면 됩니다. 컬렉션은 클래스이고 컬렉션은 인터페이스라는 점에 유의하세요. "s" 차이는 하나이지만 의미는 완전히 다릅니다.
다음과 같은 연결 리스트가 있다고 가정해 보겠습니다.
다음과 같이 코드 코드를 복사합니다.
LinkedList 목록=새 LinkedList();
목록.추가(4);
목록.추가(34);
목록.추가(22);
목록.추가(2);
다음을 사용하면 됩니다:
다음과 같이 코드 코드를 복사합니다.
Collections.sort(목록);
ll의 요소를 작은 것부터 큰 것까지 정렬할 수 있으며 결과는 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다.
[2, 4, 22, 34]
LinkedList의 요소가 문자열인 경우 기본 데이터 유형과 마찬가지로 작은 것부터 큰 것까지 정렬됩니다.
역 정렬, 즉 도달 정렬부터 작은 정렬까지 구현하려는 경우:
다음과 같이 코드 코드를 복사합니다.
Collections.sort(list,Collectons.reverseOrder());
LinkedList의 요소가 사용자 정의 개체인 경우 위의 Name 개체와 같은 Comparable 인터페이스를 구현한 다음 Collection.sort()를 통해 정렬할 수 있습니다.
자신의 생각에 따라 개체를 정렬하려면 다음과 같이 복사된 코드를 사용할 수 있습니다.
sort(List<T> 목록, 비교기<? super T> c)
이 메소드는 정렬을 수행하기 전에 먼저 Comparator의 사용과 Comparable 인터페이스의 형식을 설명해야 합니다.
다음과 같이 코드 코드를 복사합니다.
공용 인터페이스 Comparator<T> {
int 비교(T o1, T o2);
}
실제로 Comparator의 int Compare(T o1,T o2) 작성 방법은 Comparable의 CompareTo() 메소드 작성 방법과 유사합니다. 위의 Name 클래스에서는 LastName에서 비교가 시작됩니다. 이는 서양인의 습관입니다. 이때 원래 코드를 수정하지 않고 fristName에서 비교를 시작하려고 합니다.
다음과 같이 코드 코드를 복사합니다.
최종 비교기<이름> FIRST_NAME_ORDER=새 비교기<이름>() {
공개 int 비교(이름 n1, 이름 n2) {
int firstCmp=n1.firstName.compareTo(n2.firstName);
반환(firstCmp!=0?firstCmp:n1.lastName.compareTo
(n2.firstName));
}
};
이러한 방식으로 사용자 정의된 비교기 FIRST_NAME_ORDER가 작성됩니다.
이전 예제의 이름 배열을 목록으로 변환합니다.
다음과 같이 코드 코드를 복사합니다.
List<이름> list=Arrays.asList(nameArray);
Collections.sort(list,FIRST_NAME_ORDER);
이러한 방식으로 우리는 자체 정의된 비교기를 사용하여 정렬을 성공적으로 설정했습니다.