Back-End (Web)/JAVA

[JAVA] 자바의 정렬

JABHACK 2024. 11. 21. 12:31

간단한 정렬 Sort

 

1. Arrays 클래스의 정렬

  • java.util.Arrays 클래스는 배열을 정렬하는 데 사용됩니다.
  • 기본적으로 오름차순으로 정렬하며, 사용자 정의 기준으로 정렬하려면 Comparator를 사용합니다.
  • 문자열의 경우 아스키코드 순 (알파벳 순)으로 오름차순 정렬되며, 한글도 가나다 순으로 정렬됩니다.
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] numbers = {5, 2, 8, 3, 1};
        Arrays.sort(numbers);
        System.out.println(Arrays.toString(numbers)); // [1, 2, 3, 5, 8]

        String[] names = {"Charlie", "Alice", "Bob"};
        Arrays.sort(names);
        System.out.println(Arrays.toString(names)); // [Alice, Bob, Charlie]

        // 사용자 정의 기준 정렬
        Arrays.sort(names, (a, b) -> b.compareTo(a)); // 내림차순
        System.out.println(Arrays.toString(names)); // [Charlie, Bob, Alice]
    }
}

 

2. Collections 클래스의 정렬

  • java.util.Collections 클래스는 리스트를 정렬할 때 사용됩니다.
  • Collections.sort()는 Comparable 인터페이스를 구현한 클래스의 자연 정렬 기준을 따르며, 필요하면 Comparator로 미리 설정된 정렬 기준을 제공합니다. (오름차순 외의 내림차순과 같은)
  • 인터페이스의 장점대로 다양한 정렬기준을 프로그래머가 직접 제시할 수 있습니다. 

 

import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(5, 2, 8, 3, 1);
        Collections.sort(numbers);
        System.out.println(numbers); // [1, 2, 3, 5, 8]

        // 내림차순 정렬
        Collections.sort(numbers, Collections.reverseOrder());
        System.out.println(numbers); // [8, 5, 3, 2, 1]
    }
}

 

  • 둘이 다르지만 사실, Collections.Sort() -> list.sort() 함수-> List.java.sort 메서드-> Array.sort(a Comparator) 함수
  • 위와 같은 순서로 호출하다보니 결국 array, collections 배열 모드 실상은 array.sort로 돌아간다
  • 즉 근본적으로 차이가 없다

 

+ 공식 Collections 클래스 문서

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collections.html#reverseOrder()

 

 

복잡한 정렬 Stream API

📌 Java 8 이상에서 도입된 Stream API는 컬렉션 또는 배열을 쉽게 정렬할 수 있는 기능을 제공합니다.

  • sorted() 메서드는 기본적으로 자연 정렬을 따르며, 사용자 정의 기준도 제공합니다.

 

import java.util.*;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Charlie", "Alice", "Bob");

        // 오름차순 정렬
        List<String> sortedNames = names.stream()
                                        .sorted()
                                        .collect(Collectors.toList());
        System.out.println(sortedNames); // [Alice, Bob, Charlie]

        // 내림차순 정렬
        List<String> reversedNames = names.stream()
                                          .sorted(Comparator.reverseOrder())
                                          .collect(Collectors.toList());
        System.out.println(reversedNames); // [Charlie, Bob, Alice]
    }
}

 

 

복잡한 정렬 Comparator와 Comparable

📌 Java에서 객체를 정렬하기 위해 사용하는 두 가지 인터페이스입니다.

 

1. Comparable

  • 정의: 객체 자체가 "자연 정렬 순서"를 정의하도록 설계된 인터페이스.
  • 메서드: compareTo(T o) 메서드를 구현해야 합니다.
  • 사용 방법:
    • 클래스가 직접 Comparable을 구현하고, 정렬 로직을 내부에서 정의합니다.
    • 정렬 기준이 고정적이며, 클래스 설계 시 미리 정의되어야 합니다.
import java.util.*;

class Student implements Comparable<Student> {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public int compareTo(Student other) {
        return Integer.compare(this.age, other.age); // 나이를 기준으로 오름차순 정렬
    }

    @Override
    public String toString() {
        return name + " (" + age + ")";
    }
}

public class Main {
    public static void main(String[] args) {
        List<Student> students = Arrays.asList(
            new Student("Alice", 23),
            new Student("Bob", 21),
            new Student("Charlie", 22)
        );

        Collections.sort(students); // Comparable에 정의된 정렬 기준 사용
        System.out.println(students); // [Bob (21), Charlie (22), Alice (23)]
    }
}

 

2. Comparator

  • 정의: 객체 외부에서 정렬 기준을 정의할 수 있는 인터페이스.
  • 메서드: compare(T o1, T o2) 메서드를 구현해야 합니다.
  • 사용 방법:
    • 정렬 기준을 필요할 때마다 변경할 수 있도록 별도의 클래스를 작성하거나 람다식을 사용합니다.
    • 동일한 클래스에 대해 여러 정렬 기준을 제공할 수 있습니다.
    • 사용자 정렬 기준을 제기하면 보통 Comparator를 쓰게됩니다.
import java.util.*;

class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return name + " (" + age + ")";
    }
}

public class Main {
    public static void main(String[] args) {
        List<Student> students = Arrays.asList(
            new Student("Alice", 23),
            new Student("Bob", 21),
            new Student("Charlie", 22)
        );

        // 이름 기준으로 정렬
        students.sort(Comparator.comparing(Student::getName));
        System.out.println(students); // [Alice (23), Bob (21), Charlie (22)]

        // 나이 기준으로 정렬
        students.sort(Comparator.comparingInt(Student::getAge));
        System.out.println(students); // [Bob (21), Charlie (22), Alice (23)]
    }
}

 

 

 

 

  • 이외에도 Guava와 같은 서드파티 라이브러리도 정렬 도구를 제공합니다.
  • 우선순위 큐, 트리셋을 사용한 데이터를 추가하면서 정렬 상태를 유지하는 정렬도 존재합니다.
  • Java의 기본 정렬은 Timsort를 기반으로 하며, 효율적이고 안정적입니다.

 

'Back-End (Web) > JAVA' 카테고리의 다른 글

[JAVA] 열거형 ( Enum )  (0) 2024.11.22
[JAVA] HASH란 무엇인가  (1) 2024.11.21
[JAVA] 응용 정리  (1) 2024.11.15
[JAVA] NULL  (0) 2024.11.13
[JAVA] 쓰레드 & 람다 함수 & 스트림  (3) 2024.11.13