[JAVA] 자바의 정렬

hyelim·2023년 4월 28일
1

JAVA

목록 보기
1/13
post-thumbnail

배열과 리스트의 정렬

배열이나 Collection 프레임워크 등에서 sort() 를 사용하면 컴퓨터가 알아서 정렬을 해준다.
그 중 배열에서 sort()함수를 통해 정렬기능을 사용할 수 있다.

배열의 정렬 Arrays.sort()

Arrays.sort()
여기서 사용되는 sort() 는 Comparable 구현에 의해 정렬된 것인데,
오름차순정렬이 디폴트이다.

내림차순 정렬로 수행하려면 이렇게 수행하면된다
Arrays.sort(str, Collections.reverseOrder());

리스트의 정렬 Collections.sort()

아래서 정리할 건데 comparable or comparator 인터페이스를 사용하면된다

배열과 리스트의 정렬 시간복잡도 비교

따라서 Arrays.sort()를 사용하고자 할 때에는 시간복잡도에 유의해야한다

Comparable vs Comparator

Comparable - 기본 정렬기준을 구현하는데 사용.

Comparator - 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용.

객체를 특정 조건에 따라 정렬하고자할때, 아님 내림차순으로 정렬하고자 할 때는 두가지 인터페이스 중 하나를 재구현하여 사용해야한다

Comparable 인터페이스

정의

  • 정렬 수행 시 기본적으로 적용되는 정렬 기준이 되는 메서드를 정의하는 인터페이스
  • Java에서 제공되는 정렬이 가능한 클래스들은 모두 Comparable 인터페이스를 구현하고 있으며, 정렬 시에 이에 맞게 정렬이 수행된다.

구현방법

  • compareTo(T o) 메소드 구현이 필수이다(오름차순정렬이 default)
  • 정렬할 객체에 Comparable interface를 implements 후, compareTo() 메서드를 오버라이드하여 구현한다.

    음수 또는 0이면 객체의 자리가 그대로 유지되며, 양수인 경우에는 두 객체의 자리가 바뀐다.

활용법

  • 스트링을 비교시에는 this.word.compareTo(o.word)와 같이 리턴해줄 것!

  • this.word.compareTo(o.word)
    현재 객체의 word 속성과 다른 객체 o의 word 속성을 비교하여
    두 문자열이 같으면 0을 반환하고,
    현재 객체의 word 속성이 다른 객체 o의 word 속성보다 크면 양수를 반환해서 바꾸고,
    현재 객체의 word 속성이 다른 객체 o의 word 속성보다 작으면 음수를 반환해서 유지한다

따라서 이것은 오름차순 정렬을 의미하는 것을 알 수 있다.

오름 차순 정렬시 이런방법도 존재한다

@Override
public int compareTo(Word o){
	return this.word.compareTo(o.word)
}

한편, Comparable을 implements 하지 않고도 오브젝트의 특정 변수를 기준으로 정렬하는 방법은 있다.

이 때 사용하는 방법이 Comparator 이다.

Comparator 인터페이스

정의

  • 정렬 가능한 클래스(Comparable 인터페이스를 구현한 클래스)들의 기본 정렬 기준과 다르게 정렬 하고 싶을 때 사용하는 인터페이스
  • 주로 익명 클래스로 사용된다.
  • 기본적인 정렬 방법인 오름차순 정렬을 내림차순으로 정렬할 때 많이 사용한다.

구현방법

  • Comparator interface를 implements 후 compare() 메서드를 오버라이드한 myComparator class를 작성한다.

    음수 또는 0이면 객체의 자리가 그대로 유지되며, 양수인 경우에는 두 객체의 자리가 변경된다
  • 익명객체를 사용한다

사용방법

Arrays.sort(array, myComparator)
Collections.sort(list, myComparator)

메서드는 두 번째 인자로 Comparator interface를 받을 수 있다.

활용법

0) 클래스활용

1) 익명클래스활용

표현

  • 오름차순 정렬 표현 1 return o1.age-o2.age
  • 오름차순 정렬 표현 2 if(o1.age>o2.age) return 1; else if(o1.age<o2.age) return -1; else return 0;

참조

https://laugh4mile.tistory.com/175
https://gmlwjd9405.github.io/2018/09/06/java-comparable-and-comparator.html
https://devlog-wjdrbs96.tistory.com/68
https://cwondev.tistory.com/15

profile
기록용

0개의 댓글