티스토리 뷰
[Java] 정렬 인터페이스를 활용한 ArrayList 구현 (Comparable / Comparator)
꿈을 위해 잠을 잊은 그대에게 2020. 4. 2. 17:15ArrayList를 정렬하는 방법은 Collections.sort() 함수를 통해 가능합니다. Collections.sort() 함수는 두 가지 형태에 대해서 오버라이딩이 되어 있습니다.
첫 번째 함수 형태는 하나의 인자 정보를 넘겨주는 형태로 ArrayList 객체를 넘겨줍니다. 이때 ArrayList에 담기는 요소의 Type 클래스에서 Comparable 인터페이스를 구현하여 compareTo() 함수를 오버라이딩 해줘야합니다.
두 번째 함수 형태는 첫 번째 인자를 ArrayList 객체를 넘겨주게 되고 두 번째 인자는 Comparator 인터페이스를 상속받아 compare() 함수를 오버라이딩한 구현체를 넘겨주게 됩니다.
1. Integer Type Data를 요소로 가지는 ArrayList
import java.util.Comparator;
class Descending implements Comparator<Integer> {
public int compare(Integer a, Integer b) {
return b.compareTo(a);
}
}
import java.util.Comparator;
class Ascending implements Comparator<Integer> {
public int compare(Integer a, Integer b) {
return a.compareTo(b);
}
}
▼ Descending 클래스는 내림차순 정렬을 위해 Comparator 인터페이스를 상속받아 compare() 함수를 오버라이딩 한 클래스입니다. 마찬가지로 Acending 클래스는 오름차순 정렬을 위한 클래스입니다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Main{
public static void main(String[] args) {
ArrayList<Integer> integerList = new ArrayList();
integerList.add(5);
integerList.add(2);
integerList.add(3);
integerList.add(4);
integerList.add(1);
Collections.sort(integerList, new Descending());
System.out.print("내림차순 : ");
for(Integer integer : integerList) {
System.out.print("[" + integer + "]");
}
System.out.println();
Collections.sort(integerList, new Ascending());
System.out.print("오름차순 : ");
for(Integer integer : integerList) {
System.out.print("[" + integer + "]");
}
}
}
▼ 먼저 내림차순 정렬을 위해 Collections.sort() 함수를 호출합니다. 이때 첫 번째 인자로는 List 객체가 넘어가게 되고 두 번째 인자는 앞서 정의한 Comparator 인터페이스를 상속받아 구현된 Descending 클래스 객체를 넘겨주게 됩니다. 마찬가지로 오름차순 정렬을 위해서 Collections.sort() 함수를 호출하고 첫 번째 인자는 List 객체를 넘겨주면서 두 번째 인자로 Ascending 클래스 객체를 넘겨주게 됩니다.
정렬 결과
2. 사용자 정의형 객체 정렬하기
이번에는 두 가지 방식으로 사용자 정의 객체를 정렬해보겠습니다.
2.1 Comparable 인터페이스 상속
public class Movie implements Comparable<Movie> {
private String title;
private String Category;
private String grade;
public Movie(String title, String Category, String grade) {
this.title = title;
this.Category = Category;
this.grade = grade;
}
public String getTitle() {
return title;
}
public String getCategory() {
return Category;
}
public String getGrade() {
return grade;
}
public int compareTo(Movie movie) {
return this.title.compareTo(movie.title);
}
}
▼ 영화 정보를 담을 수 있는 Movie 클래스입니다. 생성자 함수를 통해 각 멤버 변수를 초기화하고 getter 함수를 구현하여 외부에서 각 멤버 변수에 접근할 수 있도록 구현하였습니다. 해당 클래스의 객체를 오름차순 정렬을 위하여 Comparable 인터페이스를 상속받아 compareTo() 함수를 오버라이딩 하였습니다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
ArrayList<Movie> movieList = new ArrayList();
movieList.add(new Movie("어벤져스", "액션", "12세 관람가"));
movieList.add(new Movie("범죄도시", "액션", "19세 관람가"));
movieList.add(new Movie("미션임파서블", "액션", "15세 관람가"));
System.out.print("Title 정렬 전 :");
for (Movie movie : movieList) {
System.out.print("[" + movie.getTitle() + "]");
}
System.out.println();
Collections.sort(movieList);
System.out.print("Title 오름차순 정렬 : ");
for (Movie movie : movieList) {
System.out.print("[" + movie.getTitle() + "]");
}
}
}
정렬 결과
2.2 Comparator 인터페이스 구현
import java.util.Comparator;
class Ascending implements Comparator<Movie> {
public int compare(Movie a, Movie b) {
return a.getTitle().compareTo(b.getTitle());
}
}
▼ Comparator 인터페이스를 상속받아 compare() 함수를 구현하는 Ascending 클래스입니다.
public class Main {
public static void main(String[] args) {
ArrayList<Movie> movieList = new ArrayList();
movieList.add(new Movie("어벤져스", "액션", "12세 관람가"));
movieList.add(new Movie("범죄도시", "액션", "19세 관람가"));
movieList.add(new Movie("미션임파서블", "액션", "15세 관람가"));
System.out.print("Title 정렬 전 :");
for (Movie movie : movieList) {
System.out.print("[" + movie.getTitle() + "]");
}
System.out.println();
Collections.sort(movieList, new Ascending());
System.out.print("Title 오름차순 정렬 : ");
for (Movie movie : movieList) {
System.out.print("[" + movie.getTitle() + "]");
}
}
}
▼ Collections.sort() 함수를 호출하면서 두 번째 인자로 앞서 구현한 Ascending 클래스 객체를 넘겨줍니다. 정렬 결과는 Comparable 인터페이스를 통해 구현한 예제와 같습니다.
'Dev > Java' 카테고리의 다른 글
이클립스 에러 could not create the virtual machine (0) | 2020.04.03 |
---|---|
이클립스 버전 업데이트 Eclipse Version Update (0) | 2020.04.03 |
[Java] 람다식(Rambda)의 정의 및 예제 (0) | 2020.04.02 |
자바 인터페이스(Interface)와 추상클래스(Abstract)의 설명과 예제 (0) | 2020.04.02 |
오버로딩(Overloading)과 오버라이딩(Overriding) 차이와 예제 (0) | 2020.04.02 |
- Total
- Today
- Yesterday