JavaRush /Java Blog /Random-KO /Java에서 정렬을 올바르게 수행하는 방법
eGarmin
레벨 41

Java에서 정렬을 올바르게 수행하는 방법

Random-KO 그룹에 게시되었습니다
많은 오픈 소스 Java 프로젝트의 소스 코드를 분석하면서 대부분의 개발자가 정렬을 두 가지 방법으로만 구현한다는 사실을 발견했습니다. sort()그 중 하나는 클래스 메소드 Collections인 or 를 사용하는 것이고 , 다른 하나는 및 와 Arrays같은 자체 정렬 데이터 구조를 사용하는 것입니다 . TreeMapTreeSetJava에서 올바르게 정렬하는 방법 - 1

sort() 메서드 사용

컬렉션을 정렬해야 하는 경우 Collections.sort().
// Collections.sort(…)
List<ObjectName> list = new ArrayList<ObjectName>();
Collections.sort(list, new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});
배열을 정렬해야 하는 경우 Arrays.sort().
// Arrays.sort(…)
ObjectName[] arr = new ObjectName[10];
Arrays.sort(arr, new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});
이 방법은 sort()컬렉션이나 배열이 이미 값으로 채워져 있을 때 매우 편리합니다.

자체 정렬 데이터 구조 사용

List목록( ) 또는 집합( Set)을 정렬해야 하는 경우 TreeSet정렬 구조를 사용하세요.
// TreeSet
Set<ObjectName> sortedSet = new TreeSet<ObjectName>(new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});
sortedSet.addAll(unsortedSet);
Map사전( ) 을 정렬해야 하는 경우 TreeMap정렬 구조를 사용하세요. TreeMap키( key)로 정렬됩니다.
// TreeMap – использующий String ключи и компаратор (Comparator) CASE_INSENSITIVE_ORDER,
// упорядочивающий строки (String) методом compareToIgnoreCase
Map<String, Integer> sortedMap = new TreeMap<String, Integer>(String.CASE_INSENSITIVE_ORDER);
sortedMap.putAll(unsortedMap);
//TreeMap – общий случай, компаратор указывается вручную
Map<ObjectName, String> sortedMap = new TreeMap<ObjectName, String>(new Comparator<ObjectName>() {
	public int compare(ObjectName o1, ObjectName o2) {
		return o1.toString().compareTo(o2.toString());
	}
});
sortedMap.putAll(unsortedMap);
위의 접근 방식은 컬렉션의 요소에 대해 많은 수의 검색을 수행해야 하는 경우에 매우 유용합니다. 자체 정렬 데이터 구조 O(log(n))O(n). 즉, 컬렉션의 데이터 양이 두 배가 되더라도 검색 시간은 두 배가 되지 않고 일정한 양만큼 증가합니다 .

정렬 문제에 대한 잘못된 접근 방식

프로그래머가 정렬 알고리즘을 독립적으로 설명하는 예를 찾을 수 있습니다. 아래 제시된 정렬 코드를 고려하십시오(이중 배열을 오름차순으로 정렬 ) . 이 코드는 비효율적일 뿐만 아니라 읽기도 어렵습니다. 그리고 그러한 예가 많이 있습니다.
double t;
for (int i = 0; i < N; i++)
	for (int j = i + 1; j < N; j++)
		if (r[j] < r[i]) {
			t = r[i];
			r[i] = r[j];
			r[j] = t;
		}
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION