티스토리 뷰
컬렉션 프레임워크(Collections Framework)에서 List는 '순서'를 기억하고 중요시하는 자료구조다. List의 담겨있는 객체의 특정 필드값을 기준으로 순서를 정렬하고 싶다면 Comparable 인터페이스와 Collections.sort()메소드를 사용한다.
아래 간단한 예제를 보자.
public class Book implements Comparable<Book> {
private String name;
private int price;
public Book(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
@Override
public int compareTo(Book o) {
return price-o.price;
}
}
Book(책)이라는 클래스는 필드로 name(이름)과 price(가격)을 가지고 있다. 그리고 Book클래스를 만든 개발자는 이 클래스를 구현한 객체들간의 기본적인 정렬은 가격에 대한 오름차순으로 할 계획이였다. 그러기 위해 Comparable인터페이스의 compareTo()메소드를 위와같이 오버라이딩 했다. (필드값을 get메소드가 아닌 필드값을 바로 명시해도 가능하다.)
정렬을 담당하는 메소드(Collections.sort)가 어떤식으로 정렬을 진행할지 알아보자. 각 객체들의 compareTo 메소드를 이용하여서 현재 compareTo메소드의 객체와 매개변수로 받은 다른 객체의 필드값 price의 차(-)를 사용한다. compareTo메소드의 반환값은 int인데 만약 두 필드값의 차가 양수이면 현재 객체(메소드를 호출한 객체)가 뒷쪽으로 이동하고, 0이라면 두 필드의 값이 같으니 정렬이 유지되고, 두 필드값의 차가 음수라면 현재 객체가 앞쪽에 위치하게 된다. 정렬을 담당하는 메소드는 이런식으로 하나씩 비교해서 각 객체들을 정렬한다. 이 원리를 이용하면 오름차순으로 진행할지 내림차순으로 진행할지 개발자가 결정 할 수 있다. 실습을 직접 진행해본다면 이해하기 어렵지 않을 것이다.
public class SortTester {
public static void main(String[] args) {
ArrayList<book> bookList = new ArrayList<>();
bookList.add(new Book("자바의정석", 9000));
bookList.add(new Book("홍길동전", 6000));
bookList.add(new Book("김소월 시집", 8000));
Collections.sort(bookList);
}
}
실습을 위해 Book클래스를 이용하여서 3개의 Book객체를 생성하고 List에 담았다. 그리고 객체들간의 정렬을 하기위해서 Collections.sort()메소드를 사용했고 매개변수로 bookList를 주었다.
for (Book book : bookList) {
System.out.println(book.getName()+":"+book.getPrice());
//출력결과 (가격의 오름차순 정렬)
//홍길동전:6000
//김소월 시집:8000
//자바의정석:9000
}
이제 이 List의 순서를 출력해보면 처음에 담았던 순서가 아닌 가격의 오름차순 정렬이 됐음을 알 수 있다.
내림차순으로 정렬하기 (정렬방식 변경하기)
@Override
public int compareTo(Book o) {
//return price-o.price;
return o.price-price;
}
compareTo메소드를 위와같이 변경해보자. 정렬 원리를 생각해서 양수로 리턴되던 값을 음수로 리턴되도록 필드값의 위치를 바꾸었다.
Collections.sort(bookList);
for (Book book : bookList) {
System.out.println(book.getName()+":"+book.getPrice());
//출력결과 (가격의 내림차순 정렬)
//자바의정석:9000
//김소월 시집:8000
//홍길동전:6000
}
이제 다시 정렬을 진행한 후, List의 순서를 출력해보면 가격의 내림차순 정렬이 됐음을 알 수 있다.
기본정렬 이외에 다른 방식으로 정렬하는 방법은 다음 포스팅을 참고 ☞ List 정렬하기 - 2. Comparator 인터페이스
'Java' 카테고리의 다른 글
인텔리제이(intelliJ)에서 롬복(Lombok) 설치&설정하기 (0) | 2018.11.11 |
---|---|
List 정렬하기 - 2. Comparator 인터페이스 (0) | 2018.11.10 |
제네릭스(Generics) - 4. 제네릭 메소드 (0) | 2018.11.05 |
제네릭스(Generics) - 3. 와일드 카드 <?> (6) | 2018.11.04 |
제네릭스(Generics) - 2. 제네릭 클래스 선언하기 (0) | 2018.11.03 |