티스토리 뷰

Dev/Java

[Java] 정렬 인터페이스를 활용한 ArrayList 구현 (Comparable / Comparator)

꿈을 위해 잠을 잊은 그대에게 2020. 4. 2. 17:15

ArrayList를 정렬하는 방법은 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 인터페이스를 통해 구현한 예제와 같습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크