티스토리 뷰

Java & Kotlin

java 정렬과 비교

필자A 2021. 7. 18. 20:39

자바에서 제공하는 api를 활용하여

정렬을 하고 싶다면

Collections, Arrays 클래스의 sort를

사용하면 됩니다.

 

우선 정렬 기준을 만들어 봅시다.

Collections.sort(strings, new Comparator<String>() {
		   @Override
		   public int compare(String o1, String o2) {
			   return o1.value() - o2.value();
		   }
	   });

첫 번째 인자는 정렬할 대상이고, 두 번째 인자는 정렬 기준(비교)입니다.

두 번째 인자에 익명 클래스를 작성하여 줍니다.

o1, o2는

dest [j-1],

배열 내의 연속된 요소들입니다.

이 요소들로

loop(조건 c.compare(dest [j-1],

실행 swap(dest, j, j-1);

}

내부에서 이런 코드 기준으로 정렬이 됩니다.

(mergeSort가 사용될 시)

 

익명 클래스 구현 로직에 따라

dest [j-1] dest[jdest [j] 이

양수면 실행

0이면 실행 x,

음수면 실행 x가 됩니다.



고로 j-1이 더 큰 수면 swap이 실행돼서

j의 값과 swap이 돼서 결국 오름차순으로 정렬이 됩니다.

 

내림차순으로 하고 싶으면 

o1 - o2를 o2 - o1으로 바꾸면 됩니다.

그러면 o2가 더 값이 클 때 swap이 일어나게 됩니다.

 

 

 

 

아래는 함수를 타고 들어가 봤습니다.

 

@SuppressWarnings({"unchecked", "rawtypes"})
    public static <T> void sort(List<T> list, Comparator<? super T> c) {
        list.sort(c);
    }

위에 Collections.sort에 가보니

파라미터로 List <T>와 Comparator <? super T>가 필요합니다.

가지고 온 list의 sort함수에 Comparator를 넣어 실행시킵니다.

 

@SuppressWarnings({"unchecked", "rawtypes"})
    default void sort(Comparator<? super E> c) {
        Object[] a = this.toArray();
        Arrays.sort(a, (Comparator) c);
        ListIterator<E> i = this.listIterator();
        for (Object e : a) {
            i.next();
            i.set((E) e);
        }
    }

toArray()로 Collection객체를

배열에 옮긴 후

Arrays.sort로 Comparator와 배열을 함께 가져갑니다.

 

public static <T> void sort(T[] a, Comparator<? super T> c) {
        if (c == null) {
            sort(a);
        } else {
            if (LegacyMergeSort.userRequested)
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, 0, a.length, c, null, 0, 0);
        }
    }

 정렬 기준(=Comparator)을 안 넣었다면

처음 조건문에서 바로 sort(c)로 이동해서

기본 정렬 기준을 사용해서 정렬이 될 것이고

정렬 기준이 존재한다면

MergeSort나 Timsort를 사용해서 

정렬이 됩니다.

.. 

타고 올라가서

for (int i=low; i<high; i++)
                for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
                    swap(dest, j, j-1);
            return;

MergeSort 선택 시

위와 같이 for문의

c.compare(dest [j-1], dest [j]) > 0; 에서 비교가 사용이 됩니다.

 

다른 분 기점으로 TimSort가 사용될 수도 있는데

오늘은 대략적인 사용방법만 공부하는 시간이라

TimSort는 다음에 하겠습니다.

반응형

'Java & Kotlin' 카테고리의 다른 글

spring mybatis 사용해보기, 사용법  (0) 2021.07.22
REST API  (0) 2021.07.22
테스트코드 작성후 느낀점  (0) 2021.07.11
postgresql 설정, springBoot  (0) 2021.07.11
springBoot error  (0) 2021.07.09
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함