--> [Java] 자바 - ArrayList 정렬하기 (Comparable / Comparator)

[Java] 자바 - ArrayList 정렬하기 (Comparable / Comparator)

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 인터페이스를 통해 구현한 예제와 같습니다.

댓글(0)

Designed by JB FACTORY