[Java] 객체 정렬

Jay Mild Lee·2022년 11월 22일
3

Java

목록 보기
7/10
post-thumbnail

I. 객체 정렬

새로 정의한 객체를 정렬해야 할 경우가 있다. 예를 들어 String nameint phone_number를 field로 가지는 객체 Student가 있다고 가정하자. Student 객체 n개를 가진 ArrayList List<Student> arrlist가 있다면, 1) ArrayList를 학생의 이름 순으로 정렬해야하는 경우2) ArrayList를 학생의 핸드폰 번호 순으로 정렬해야하는 경우가 있을 수 있다.

Java에서는 이러한 객체를 정렬하는 기준을 Custom할 수 있도록 몇 가지 interface를 제공하는데, 바로 ComparbleComparator다.

II. Comparable

  • Package : java.lang.Comparble
  • 정렬 수행 시, 가장 기본적으로 적용되는 정렬 기준을 정의하는 인터페이스

1) 기준 적용 방법

  1. 정렬해야하는 객체에 Comparable을 implement하고, compareTo() 메소드를 @Override한다.
  2. 현재 객체 > Object로 넘어온 객체일 경우 양수 return
  3. 현재 객체 < Object로 넘어온 객체일 경우 음수 return
  4. 현재 객체 = Object로 넘어온 객체일 경우 '0' return
  5. return 값에 따라, 음수 혹은 0 일 경우 index를 유지하고, 양일 경우 index를 서로 바꾼다.

2) sort() 호출 방법

  • Arrays.sort(arr);
  • Collections.sort(list);

3) 구현 예시

    static public class Student implements Comparable{
        // field
        private String name;
        private HashMap<String, Integer> scores;
        
        (...생략...)

        @Override
        public int compareTo(Object o) {
            Student s = (Student) o;
            if (this.scores.get("Java") > s.scores.get("Java")){
                return 1;
            }
            else {
                return -1;
            }
        }
    }

4) ✨참고 : sort()의 알고리즘✨

4-1) Arrays.sort()

  • 기본 자료형(int, double, char 등) 배열
    : Dual Pivot QuickSort(QuickSort + InsertionSort)
  • 새로 정의한 객체에 대한 배열
    : Tim Sort(MergeSort + InsertionSort)

4-2) Collections.sort()

내부적으로 Arrays.sort() 사용

III. Comparator

  • Package : java.lang.Comparator
  • 정렬 수행 시, Class에 정의되지 않은 방식으로 정렬할 때 사용

1) 기준 적용 방법

1-1) Comparator Class를 implement해서 사용

  1. Comparator를 implement한 객체를 생성하고, compare() method를 @Override한다.
  2. 현재 객체 > Object로 넘어온 객체일 경우 양수 return
  3. 현재 객체 < Object로 넘어온 객체일 경우 음수 return
  4. 현재 객체 = Object로 넘어온 객체일 경우 '0' return
  5. return 값에 따라, 음수 혹은 0 일 경우 index를 유지하고, 양일 경우 index를 서로 바꾼다.

1-2) Comparator 익명 클래스를 활용

  1. Comparator의 익명 클래스를 선언하고, compare() method를 @Override한다.
  2. 현재 객체 > Object로 넘어온 객체일 경우 양수 return
  3. 현재 객체 < Object로 넘어온 객체일 경우 음수 return
  4. 현재 객체 = Object로 넘어온 객체일 경우 '0' return
  5. return 값에 따라, 음수 혹은 0 일 경우 index를 유지하고, 양일 경우 index를 서로 바꾼다.

2) sort() 호출 방법

2-1) Comparator Class를 implement해서 사용할 때

  • Collections.sort(arrlist, new PyComparator());

2-2) Comparator 익명 클래스를 활용할 때

  • Collections.sort(arrlist, SpComparator);

3) 구현 예시

3-1) Comparator Class를 implement해서 사용

class PyComparator implements Comparator<Student> {
            @Override
            public int compare(Student s1, Student s2) {
                if (s1.scores.get("Python") > s2.scores.get("Python")) {
                    return 1;
                }
                else {
                    return -1;
                }
            }
        }
        Collections.sort(arrlist, new PyComparator());

3-2) Comparator 익명 클래스를 활용

Comparator<Student> SpComparator = new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                if (s1.scores.get("Spring") > s2.scores.get("Spring")) {
                    return 1;
                }
                else {
                    return -1;
                }
            }
        };
        Collections.sort(arrlist, SpComparator);

0개의 댓글