List를 정렬하는 방법에 대해 설명드리겠습니다.
sort 메소드 사용법
List의 메소드 중에 sort() 메소드가 있습니다.
sort 메소드를 사용할 때 정렬 기준을 정해주면 원하는대로 정렬이 가능합니다.
기본적으로는 다음과 같이 사용합니다.
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(9);
numbers.add(2);
numbers.add(4);
numbers.add(7);
System.out.println("Before sort numbers = " + numbers);
numbers.sort((o1, o2) -> o1.compareTo(o2));
System.out.println("After sort numbers = " + numbers);
}
}
정수 리스트를 오름차순하는 코드입니다.
sort 메소드 안에 각 요소들을 비교하는 코드를 넣어서 정렬을 진행하였습니다.
그 외에 아래 방법도 사용 가능합니다.
// 정수 오름차순 정렬 방법
// Collections 클래스의 sort 메소드를 사용하는 방법
Collections.sort(numbers);
// Integer 클래스의 비교 메소드를 사용하는 방법
numbers.sort((o1, o2) -> Integer.compare(o1, o2));
numbers.sort(Integer::compareTo);
// Comparator 클래스의 비교 메소드 사용
numbers.sort(Comparator.naturalOrder());
// 내림차순 정렬
numbers.sort(Comparator.reverseOrder());
객체 리스트 정렬
Integer나 String은 별도의 정렬기준 없이도 해당 클래스에 있는 비교 메소드를 사용하여 간단한 정렬이 가능합니다.
그런데 직접 만든 객체는 정렬 기준이 없어서 비교를 하고자 할 때 다음과 같이 사용해야 합니다.
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person(1990, "James"));
people.add(new Person(1950, "Peter"));
people.add(new Person(2003, "Alice"));
people.add(new Person(2024, "Harry"));
people.add(new Person(1996, "Simon"));
System.out.println("people = " + people);
people.sort((o1, o2) -> o1.birthYear.compareTo(o2.birthYear));
System.out.println("people = " + people);
}
public static class Person {
private Integer birthYear;
private String name;
public Person(Integer birthYear, String name) {
this.birthYear = birthYear;
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"birthYear=" + birthYear +
", name='" + name + '\'' +
'}';
}
}
객체 내부에서 값을 가져와서 다른 객체의 값과 비교하는 방식으로 비교하였습니다.
Comparable 사용법
Collections.sort 방식을 사용하게 되면 오류가 발생합니다.
객체를 Collections.sort로 정렬하려면 Comparable 인터페이스를 구현해야 합니다.
Comparable 인터페이스는 객체를 정렬할 수 있게 해주는 인터페이스입니다.
public static class Person implements Comparable<Person> {
private Integer birthYear;
private String name;
public Person(Integer birthYear, String name) {
this.birthYear = birthYear;
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"birthYear=" + birthYear +
", name='" + name + '\'' +
'}';
}
@Override
public int compareTo(Person o) {
return birthYear.compareTo(o.birthYear);
}
}
Comparable 인터페이스를 구현하였습니다
Comparable이 구현된 객체를 정렬할 때 다음과 같이 사용할 수 있습니다.
// 같은 결과
Collections.sort(people);
people.sort(Person::compareTo);
Collections.sort는 객체에 구현된 compareTo 메소드로 비교를 진행합니다.
두번째 줄처럼 compareTo 메소드를 직접 사용해도됩니다.