Study/java

[Java] List 정렬 방법 정리

 

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 방식을 사용하게 되면 오류가 발생합니다.

클래스가 Comparable을 구현하지 않았기 때문에 Collections.sort 사용 불가
클래스가 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 메소드를 직접 사용해도됩니다.