Java 배열 및 ArrayList 를 Comparable과 Comparator 를 이용해 정렬하기
안드로이드 앱을 만들 때, 자료형으로 배열이나 arrayList를 사용하게 되는 경우가 많은데요.
작업을 하다보면, 자료를 넣은대로 꺼내서 사용하지 않는 경우도 생기고,
유저에게 보여줄 때, 순서를 필터링해서 보여줘야 하는 경우도 생깁니다.
오늘은, 배열이나, ArrayList를 이용해서, 자료를 원하는 Data기준으로,
정렬하는 방법에 대해서 정리해 보도록 하겠습니다.
1. 간단한 배열의 오름차순 정렬
먼저 아래와 같은 간단한 형태의 배열을 생성합니다.
순서가 뒤죽박죽인데요.
오름차순으로 숫자가 적은 순서대로 정렬해 보도록 하겠습니다.
Array.sort() 메소드에 인자로 위에서 생성한 Array를 넣어주기만 하면 되는데요.
이것을 정렬해서 리스트로 표현해보겠습니다.
참고로 RecyclerView로 리스트를 만드는 방법은 아래 링크를 참조해주세요
>>> RecyclerView 로 listview 정복 <<<
실행시키면 아래와 같이 오름차순으로 정렬된 것을 볼 수 있습니다.
정말 간단하게 정렬이 되었는데요.
이번에는 데이터 모델클래스를 정의하고 객체들을 생성한 후에,
데이터를 정렬하는 것에 대해서 알아보겠습니다.
2. 데이터 모델 클래스 객체 생성 후 정렬
2-1. 데이터 모델 클래스 생성과 배열
위와 같이 간단하게, 하나의 String이나 int만 정렬하는 경우도 있지만,
아래와 같은 데이터 모델을 가진 객체의 배열의 경우에는 어떻게 정렬할 수 있을까요?
한번 객체를 생성하고, Array로 집어넣어 보겠습니다.
여기서 바로 Arrays.sort()메소드를 사용하면 될까요?
아직 아닙니다. 한가지 더 해주어야 하는 것이 있는데요.
정렬의 기준을 마련해 주는 것인데요. 아래에서 알아보도록 하겠습니다.
2-2. Comparable 의 구현(implement)
위에서 애기한 대로 Arrays.sort()를 실행하기 전에,
정렬의 기준을 마련하기 위해서는,
Student데이터 클래스에 Comparable<T>이라는 인터페이스를 implement해주어야 합니다.
이 때, 구현해야 하는 메소드는, compareTo()이구요.
참고로 compareTo()메소드의 소스코드에 적힌 설명을 쓱 보고 지나가겠습니다.
주어진 객체를 비교하여서 작으면 음수, 같으면 0, 더 크다면 양수로 반환한다고 되어 있네요.
그럼 이제, CompareTo()를 구현해야 하는데요.
위의 설명대로, compareTo메소드로 들어온 값보다 크면 양수값을,
그보다 작으면 음수를, 같으면 0을 반환하도록 compareTo()메소드를 아래와 같이, 구현하였습니다.
(물론 score - o.getScore를 해준값을 return하도록 해줘도 됩니다.
그렇지만, 가능성이 낮긴해도 int의 범위를 초과할 수도 있으므로, 조건문을 사용하겠습니다.)
여기서는 Score점수를 기준으로 높은 것이 위로 가도록 Descending 정렬을 하겠다고, 구현하겠습니다.
ascending으로 하고 싶다면, score > o.getscore()일 경우가 -1이고, 그 반대가 1을 return 해 주어야 겠습니다.
이제 드디어, Array.sort()를 실행해 보겠습니다.
아래와 같이, 점수순서대로 잘 정렬되었습니다.
2-3. Comparator 의 구현
Comparator를 이용해서도, 정렬을 할 수 있는데요.
사실 개인적으로는 이 방법을 더 많이 사용하는 것 같아요.
특히나, Arrays.sort()메소드는 두번째 인자로 Comparator를 가질 수 있도록 해놓았는데요.
sort()메소드의 소스 잠깐 보고 가시죠.
아래와 같이 sort()메소드의 두번째 인자를, 익명 클래스로 간단하게 구현하여 넘겨줄 수 있습니다.
나이 순서대로 잘, 정렬되어 나옵니다.
당연하게도, 익명클래스가 아니라, 아래와 같이 클래스를 작성한 후에,
객체로 만들어서, sort의 두번째 인자로 넘겨줘도 똑같이 동작합니다.
Comparable 이 data클래스에 implement하는 반면,
Comparator는 고유의 클래스를 가지므로, 다양한 클래스로 정의하고,
좀 더 유연하게 쓸 수 있다는 장점이 있겠네요.
3. ArrayList에서의 정렬
Collections.reverOrder()메소드를 사용하면 위의 순서의 역순으로 정렬할 수 있는데요.
인자로 역순서를 만들 ArrayList를 주기만 하면 됩니다.
다음가 같이, 나이의 역순으로(내림차순으로) 나오는 것을 볼 수 있습니다.
이렇게 해서, 배열과 ArrayList의 정렬에 대해서 정리해 보았습니다.