Java

[Java]날짜 정렬 방법

DevStory 2022. 8. 11.

날짜 정렬 방법

이번 포스팅은 Java에서 날짜 타입의 데이터로 구성된 배열 또는 ArrayList를 정렬하는 방법을 소개합니다.

 

Java에서 제공하는 날짜 클래스는 다양합니다.

 

다음 목록은 이번 포스팅에서 소개하는 방법을 적용할 수 있는 날짜 클래스입니다.

- Date

- LocalDate

- LocalDateTime

- ZonedDateTime

- OffsetDateTIme


Collections의 sort 메서드

java.util.Collections클래스에 있는 sort() 메서드는 매개변수로 전달된 List를 오름차순으로 정렬합니다.

 

이번 포스팅은 Stream API를 사용하는 방법을 제외하고 Collections 클래스의 sort() 메서드를 사용하여 날짜 타입의 List를 정렬합니다.

 

만약, 날짜 타입의 데이터로 구성된 ArrayList인 경우 다음 방법으로 List를 정렬할 수 있습니다.

 

정렬 방법

1. 오름차순으로 정렬하는 경우 sort() 메서드에 첫 번째 매개변수로 List를 전달합니다.

2. 내림차순으로 정렬하는 경우 sort() 메서드의 첫 번째 매개변수로 List를 전달하고 두 번째 매개변수로 Collections.reverseOrder()를 전달합니다.

public static void main(String args[]) {
  List<Date> dateList = new ArrayList<>();
  dateList.add(new Date(2020, 1, 1));
  dateList.add(new Date(2021, 5, 5));
  dateList.add(new Date(2020, 3, 10));
  dateList.add(new Date(2021, 7, 1));

  System.out.println("정렬 전");
  dateList.forEach(item -> {
    System.out.println(item.getYear() + "년 " 
            + item.getMonth() + "월 " 
            + item.getDate() + "일");
  });

  Collections.sort(dateList);

  System.out.println("\n오름차순 정렬");
  dateList.forEach(item -> {
    System.out.println(item.getYear() + "년 " 
            + item.getMonth() + "월 " 
            + item.getDate() + "일");
  });

  Collections.sort(dateList, Collections.reverseOrder());

  System.out.println("\n내림차순 정렬");
  dateList.forEach(item -> {
    System.out.println(item.getYear() + "년 " 
            + item.getMonth() + "월 " 
            + item.getDate() + "일");
  });
}

[실행 결과]

정렬 전
2020년 1월 1일
2021년 5월 5일
2020년 3월 10일
2021년 7월 1일

오름차순 정렬
2020년 1월 1일
2020년 3월 10일
2021년 5월 5일
2021년 7월 1일

내림차순 정렬
2021년 7월 1일
2021년 5월 5일
2020년 3월 10일
2020년 1월 1일

만약, List가 사용자 정의 클래스 타입으로 선언된 경우에는 날짜를 정렬하는 방법이 복잡합니다.

public class Person {
  private String Name;
  private Date date;
}

Collections 클래스의 sort() 메서드에 존재하는 기본 비교자가 어떤 기준으로 데이터를 정렬해야 할지 알 수 없기 때문입니다.

 

따라서, List가 사용자 정의 클래스 타입으로 선언된 경우 아래에서 소개하는 방법들을 적용하여 List를 정렬합니다.


사용자 정의 클래스

이번 포스팅에서 사용되는 Person 클래스입니다.

public class Person {
  private String Name;
  private Date date;

  public Person(String name, Date date) {
    Name = name;
    this.date = date;
  }

  public String getName() {
    return Name;
  }

  public void setName(String name) {
    Name = name;
  }

  public Date getDate() {
    return date;
  }

  public void setDate(Date date) {
    this.date = date;
  }
  
  @Override
  public String toString() {
    return "Person [Name=" + Name
            + ", date="
            + date.getYear() + "월 "
            + date.getMonth() + "월 "
            + date.getDate() + "일]";
  }
}

방법 1. 비교자 구현

첫 번째 방법으로 비교자를 구현하는 방법입니다.

 

정렬 방법

1. java.util.Comparator 인터페이스를 구현하는 클래스에서 compare() 메서드를 재정의합니다.

2. 해당 클래스의 인스턴스를 sort() 메서드의 두 번째 매개변수로 전달합니다.

3. 내림차순으로 정렬하고 싶은 경우 Comparator 인터페이스를 구현하는 클래스의 인스턴스 뒤에 reversed() 메서드를 호출합니다.

 

[비교자 - PersonComparator]

public class PersonComparator implements Comparator<Person> {
  @Override
  public int compare(Person person1, Person person2) {
    return Long.valueOf(person1.getDate().getTime())
            .compareTo(person2.getDate().getTime());
  }
}

[Main문]

public static void main(String args[]) {
  Person person1 = new Person("둘리", new Date(2020, 1, 1));
  Person person2 = new Person("또치", new Date(2021, 5, 5));
  Person person3 = new Person("도넛", new Date(2020, 3, 10));
  Person person4 = new Person("생선", new Date(2021, 7, 1));

  List<Person> personList = new ArrayList<>();
  personList.add(person1);
  personList.add(person2);
  personList.add(person3);
  personList.add(person4);

  System.out.println("정렬 전");
  personList.forEach(item -> System.out.println(item.toString()));

  Collections.sort(personList, new PersonComparator());

  System.out.println("\n오름차순 정렬");
  personList.forEach(item -> System.out.println(item.toString()));

  Collections.sort(personList, new PersonComparator().reversed());

  System.out.println("\n내림차순 정렬");
  personList.forEach(item -> System.out.println(item.toString()));
}

[실행 결과]

정렬 전
Person [Name=둘리, date=2020월 1월 1일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=생선, date=2021월 7월 1일]

오름차순 정렬
Person [Name=둘리, date=2020월 1월 1일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=생선, date=2021월 7월 1일]

내림차순 정렬
Person [Name=생선, date=2021월 7월 1일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=둘리, date=2020월 1월 1일]

방법 2. 람다 표현식

두 번째 방법으로 람다 표현식을 사용하는 방법입니다.

 

정렬 방법

1. 비교자를 람다 표현식으로 작성합니다.

2. 람다 표현식을 sort() 메서드의 두 번째 매개변수로 전달합니다.

3. 내림차순으로 정렬하고 싶은 경우 람다 표현식 뒤에 reversed() 메서드를 호출합니다.

public static void main(String args[]) {
  Person person1 = new Person("둘리", new Date(2020, 1, 1));
  Person person2 = new Person("또치", new Date(2021, 5, 5));
  Person person3 = new Person("도넛", new Date(2020, 3, 10));
  Person person4 = new Person("생선", new Date(2021, 7, 1));

  List<Person> personList = new ArrayList<>();
  personList.add(person1);
  personList.add(person2);
  personList.add(person3);
  personList.add(person4);

  System.out.println("정렬 전");
  personList.forEach(item -> System.out.println(item.toString()));

  Comparator<Person> comparator = (prod1, prod2) -> Long.valueOf(
          prod1.getDate().getTime())
          .compareTo(prod2.getDate().getTime());

  Collections.sort(personList, comparator);

  System.out.println("\n오름차순 정렬");
  personList.forEach(item -> System.out.println(item.toString()));

  Collections.sort(personList, comparator.reversed());

  System.out.println("\n내림차순 정렬");
  personList.forEach(item -> System.out.println(item.toString()));
}

[실행 결과]

정렬 전
Person [Name=둘리, date=2020월 1월 1일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=생선, date=2021월 7월 1일]

오름차순 정렬
Person [Name=둘리, date=2020월 1월 1일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=생선, date=2021월 7월 1일]

내림차순 정렬
Person [Name=생선, date=2021월 7월 1일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=둘리, date=2020월 1월 1일]
반응형

방법 3. 메서드 참조

세 번째 방법으로 메서드 참조를 사용하는 방법입니다.

 

비교자 구현, 람다 표현식과는 다르게 Collections 클래스의 sort() 메서드가 아닌 List 객체의 sort() 메서드를 사용합니다.

 

정렬 방법

1. List 객체의 sort() 메서드를 사용합니다.

2. 날짜 필드를 참조하는 메서드 참조문을 Comparator.comparing() 메서드의 매개변수로 전달합니다.

3. 2번 과정에서 작성한 Comparator.comparing() 메서드를 sort() 메서드의 매개변수로 전달합니다.

4. 내림차순으로 정렬하고 싶은 경우 Comparator.comparing() 메서드 뒤에 reversed() 메서드를 호출합니다.

public static void main(String args[]) {
  Person person1 = new Person("둘리", new Date(2020, 1, 1));
  Person person2 = new Person("또치", new Date(2021, 5, 5));
  Person person3 = new Person("도넛", new Date(2020, 3, 10));
  Person person4 = new Person("생선", new Date(2021, 7, 1));

  List<Person> personList = new ArrayList<>();
  personList.add(person1);
  personList.add(person2);
  personList.add(person3);
  personList.add(person4);

  System.out.println("정렬 전");
  personList.forEach(item -> System.out.println(item.toString()));

  personList.sort(Comparator.comparing(Person::getDate));

  System.out.println("\n오름차순 정렬");
  personList.forEach(item -> System.out.println(item.toString()));

  personList.sort(Comparator.comparing(Person::getDate).reversed());

  System.out.println("\n내림차순 정렬");
  personList.forEach(item -> System.out.println(item.toString()));
}

[실행 결과]

정렬 전
Person [Name=둘리, date=2020월 1월 1일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=생선, date=2021월 7월 1일]

오름차순 정렬
Person [Name=둘리, date=2020월 1월 1일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=생선, date=2021월 7월 1일]

내림차순 정렬
Person [Name=생선, date=2021월 7월 1일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=둘리, date=2020월 1월 1일]

방법 4. Stream API

마지막으로 Java 8 Version 이상인 경우 Stream API를 사용할 수 있습니다.

 

정렬 방법

1. stream() 메서드를 호출하여 List를 스트림으로 변환합니다.

2. 변환된 스트림을 정렬하기 위해 sorted() 메서드를 호출합니다.

3. 데이터를 정렬하기 위해 sorted() 메서드에 비교자를 전달합니다.

4. 정렬된 스트림을 List로 변환합니다.

5. 내림차순으로 정렬하고 싶은 경우 3번 과정에서 전달된 비교자 뒤에 reversed() 메서드를 호출합니다.

public static void main(String args[]) {
  Person person1 = new Person("둘리", new Date(2020, 1, 1));
  Person person2 = new Person("또치", new Date(2021, 5, 5));
  Person person3 = new Person("도넛", new Date(2020, 3, 10));
  Person person4 = new Person("생선", new Date(2021, 7, 1));

  List<Person> personList = new ArrayList<>();
  personList.add(person1);
  personList.add(person2);
  personList.add(person3);
  personList.add(person4);

  System.out.println("정렬 전");
  personList.forEach(item -> System.out.println(item.toString()));

  List<Person> personListAsc = personList
          .stream()
          .sorted(Comparator.comparing(Person::getDate))
          .collect(Collectors.toList());

  System.out.println("\n오름차순 정렬");
  personListAsc.forEach(item -> System.out.println(item.toString()));

  List<Person> personListDesc = personList
          .stream()
          .sorted(Comparator.comparing(Person::getDate).reversed())
          .collect(Collectors.toList());

  System.out.println("\n내림차순 정렬");
  personListDesc.forEach(item -> System.out.println(item.toString()));
}

[실행 결과]

정렬 전
Person [Name=둘리, date=2020월 1월 1일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=생선, date=2021월 7월 1일]

오름차순 정렬
Person [Name=둘리, date=2020월 1월 1일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=생선, date=2021월 7월 1일]

내림차순 정렬
Person [Name=생선, date=2021월 7월 1일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=둘리, date=2020월 1월 1일]
반응형

댓글