코딩테스트

정렬) 다양한 정렬 예제

hpehpeyy 2025. 4. 16. 11:23

💡전체 코드

더보기
public class SortEX {
	public static void main(String[] args) {
		int[] arr = new int[] { 2, 5, 1, 4, 3 };

		// 기본자료형 오름차순 정렬
		Arrays.sort(arr);
		System.out.println(Arrays.toString(arr));

		// 기본자료형 내림차순 정렬
		// Comparator.reverseOrder()안됨 (문자열은 됨)
//	    Arrays.sort(arr, Comparator.reverseOrder());
		String[] names = { "최길동", "박길동", "홍길동", "김길동" };
		Arrays.sort(names);
		System.out.println("문자열 오름차순-----------------");
		System.out.println(Arrays.toString(names));

		System.out.println("문자열 내림차순-----------------");
		Arrays.sort(names, Collections.reverseOrder());
		System.out.println(Arrays.toString(names));

		// 기본자료형을 내림차순으로 정렬하기 위해 int -> Integer로 변환
		Integer[] arr2 = Arrays.stream(arr).boxed().toArray(Integer[]::new);
		System.out.println("정수 내림차순--------------------");
		Arrays.sort(arr2, Collections.reverseOrder());
		System.out.println(Arrays.toString(arr2));

		// 정렬알고리즘 응용
		// Map 배열을 정렬해서 출력
		Map<String, Object> map = new HashMap<>();
		map.put("name", "박길동");
		map.put("score", 60);
		Map<String, Object> map2 = new HashMap<>();
		map2.put("name", "김길동");
		map2.put("score", 80);
		Map<String, Object> map3 = new HashMap<>();
		map3.put("name", "이길동");
		map3.put("score", 100);
		Map<String, Object> map4 = new HashMap<>();
		map4.put("name", "최길동");
		map4.put("score", 70);

		List<Map> list = new ArrayList<>();
		list.add(map);
		list.add(map2);
		list.add(map3);
		list.add(map4);

		Collections.sort(list, new Comparator<Map>() {
			@Override
			public int compare(Map o1, Map o2) {
//	                return (int)o2.get("score") - (int)o1.get("score"); // 내림차순
				return (int) o1.get("score") - (int) o2.get("score"); // 오름차순
			}
		});

		list.stream().forEach(m -> System.out.println(m));

	}
}

🔽 기본 자료 배열 정렬 int[ ]

오름차순 : Arrays.sort()

int[] arr = new int[] { 2, 5, 1, 4, 3 };
Arrays.sort(arr); // 오름차순
System.out.println(Arrays.toString(arr)); // [1, 2, 3, 4, 5]

 

내림차순

// 기본자료형 내림차순 정렬(x)
Comparator.reverseOrder();
Arrays.sort(arr, Comparator.reverseOrder());

Collections.reverseOrder()은 문자열 배열을 내림차순으로 정렬할 때 사용하는 메서드이며, Arrays.sort(arr)는 기본적으로 오름차순 정렬만 지원되므로 내림차순 정렬은 별도로 할 수 없습니다.

 

📍방법 : int -> Integer로 변환

// 기본자료형을 내림차순으로 정렬하기 위해 int -> Integer로 변환
Integer[] arr2 = Arrays.stream(arr).boxed().toArray(Integer[]::new);
System.out.println("정수 내림차순--------------------");
Arrays.sort(arr2, Collections.reverseOrder());
System.out.println(Arrays.toString(arr2)); //[5, 4, 3, 2, 1]

 

  • Arrays.stream(arr): 기본 자료형 배열 (int[])을 스트림으로 변환합니다.
  • boxed(): int 배열을 객체형 Integer[]로 변환합니다. (Java의 기본 자료형은 Comparator와 함께 사용할 수 없기 때문에 객체형으로 변환해야 합니다.)
  • Collections.reverseOrder(): Integer[] 배열을 내림차순으로 정렬합니다.

🔽 문자 배열 정렬 String[ ]

오름차순 & 내림차순 (Arrays.sort(), Collections.reverseOrder())

String[] names = { "최길동", "박길동", "홍길동", "김길동" };

// 오름차순 정렬
Arrays.sort(names); 
System.out.println(Arrays.toString(names)); // [김길동, 박길동, 최길동, 홍길동]

// 내림차순 정렬
Arrays.sort(names, Collections.reverseOrder());
System.out.println(Arrays.toString(names)); // [홍길동, 최길동, 박길동, 김길동]
  • Arrays.sort(names): 문자열 배열을 유니코드 순서에 따라 오름차순으로 정렬합니다.
  • Collections.reverseOrder(): 문자열 배열을 내림차순으로 정렬할 때 사용하는 메서드입니다. Comparator.reverseOrder()는 Comparator 객체를 반환하며, 이를 통해 내림차순 정렬을 할 수 있습니다.

 


🔽 Map 객체 정렬

오름차순 & 내림차순

Map<String, Object> map = new HashMap<>();
map.put("name", "박길동");
map.put("score", 60);
Map<String, Object> map2 = new HashMap<>();
map2.put("name", "김길동");
map2.put("score", 80);
Map<String, Object> map3 = new HashMap<>();
map3.put("name", "이길동");
map3.put("score", 100);
Map<String, Object> map4 = new HashMap<>();
map4.put("name", "최길동");
map4.put("score", 70);

List<Map> list = new ArrayList<>();
list.add(map);
list.add(map2);
list.add(map3);
list.add(map4);
  • 여러 개의 Map 객체를 생성하고, 각 객체에 name과 score를 넣습니다.
  • 이 Map 객체들을 리스트에 추가하여, 이후 이 리스트를 정렬합니다.
Collections.sort(list, new Comparator<Map>() {
    @Override
    public int compare(Map o1, Map o2) {
        return (int) o1.get("score") - (int) o2.get("score"); // 오름차순
    }
});

list.stream().forEach(m -> System.out.println(m)); //출력
  • Collections.sort(list, new Comparator<Map>()): 리스트의 Map 객체들을 정렬합니다. Comparator를 사용하여 score를 기준으로 정렬합니다.
오름차순
return (int) o1.get("score") - (int) o2.get("score");
//{name=박길동, score=60}
//{name=최길동, score=70}
//{name=김길동, score=80}
//{name=이길동, score=100}
내림차순
return (int) o2.get("score") - (int) o1.get("score");
//{name=이길동, score=100}
//{name=김길동, score=80}
//{name=최길동, score=70}
//{name=박길동, score=60}

🔽 제네릭을 활용한 Comparator 개선

Collections.sort(list, new Comparator<Map<String, Object>>() {
    @Override
    public int compare(Map<String, Object> o1, Map<String, Object> o2) {
        return Integer.compare((int)o1.get("score"), (int)o2.get("score"));
    }
});
  • Comparator를 제네릭으로 사용하여 타입 안정성을 향상시킬 수 있습니다. Integer.compare() 메서드를 사용하여 두 Integer 객체를 비교합니다.
  • Integer.compare()는 두 값이 동일할 때 0, 첫 번째 값이 크면 1, 두 번째 값이 크면 -1을 반환합니다. 이를 사용하여 비교할 수 있습니다.

 

🔍 요약

기본 타입 정렬 Arrays.sort(int[]) 기본 타입 배열(정수) 오름차순 정렬만 가능
문자열 정렬 Arrays.sort(String[]) 문자열 배열을 오름차순/내림차순 모두 정렬 가능
객체형 정렬 (내림차순 가능) Integer[] + Comparator 객체형 배열(Integer[])을 Comparator와 함께 사용하여 내림차순 정렬 가능
컬렉션 정렬 Collections.sort(List<T>, Comparator) 리스트 타입 데이터 정렬 가능, 비교 기준 커스터마이징 가능
커스텀 정렬 기준 지정 Arrays.sort(Object[], Comparator) 객체 배열에 대해 커스텀 정렬 기준을 지정할 수 있음
정렬 기준 커스터마이징 도구 Comparator 정렬 기준을 커스터마이즈할 수 있는 인터페이스
기본 타입을 객체형으로 변환 boxed() 기본 타입 배열을 객체형 배열로 변환 (예: int[] → Integer[])

 


 

🔗 Comparator.reverseOrder(), Collections.reverseOrder()

 

자바) Comparator.reverseOrder(), Collections.reverseOrder()

Comparator.reverseOrder()Comparator.reverseOrder()는 Comparator 인터페이스를 구현하는 객체에 대한 내림차순 정렬을 위한 메서드입니다.이 메서드는 Comparator 객체를 반환합니다. 반환된 Comparator는 주어진 자

hpehpeyy.tistory.com

 

'코딩테스트' 카테고리의 다른 글

정렬) 2차원 배열 정렬  (1) 2025.04.15